source: subversion/applications/utils/mod_tile/speedtest.cpp @ 15816

Last change on this file since 15816 was 13274, checked in by jonb, 11 years ago

Fix protocol version in mod_tipe speedtest.cpp

File size: 6.1 KB
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <unistd.h>
4#include <sys/types.h>
5#include <sys/socket.h>
6#include <sys/stat.h>
7#include <sys/time.h>
8#include <sys/un.h>
9#include <poll.h>
10#include <errno.h>
11#include <math.h>
12#include <limits.h>
13#include <string.h>
14
15#include "gen_tile.h"
16#include "protocol.h"
17#include "render_config.h"
18#include "dir_utils.h"
19
20#define DEG_TO_RAD (M_PI/180)
21#define RAD_TO_DEG (180/M_PI)
22
23#ifndef METATILE
24#warning("Speed test not implemented for non-metatile mode. Feel free to submit fix")
25int main(int argc, char **argv)
26{
27    fprintf(stderr, "Speed test not implemented for non-metatile mode. Feel free to submit fix!\n");
28    return -1;
29}
30#else
31
32static const int minZoom = 0;
33static const int maxZoom = 18;
34
35#if 1
36static double boundx0=-0.5;
37static double boundy0=51.25;
38static double boundx1=0.5;
39static double boundy1=51.75;
40#endif
41#if 0
42//    bbox = (-6.0, 50.0,3.0,58.0)
43static double boundx0=-6.0;
44static double boundy0=50.0;
45static double boundx1=3.0;
46static double boundy1=58.0;
47#endif
48#if 0
49// UK: 49.7,-7.6, 58.8, 3.2
50static double boundx0=-7.6;
51static double boundy0=49.7;
52static double boundx1=3.2;
53static double boundy1=58.8;
54#endif
55
56
57static double minmax(double a, double b, double c)
58{
59#define MIN(x,y) ((x)<(y)?(x):(y))
60#define MAX(x,y) ((x)>(y)?(x):(y))
61    a = MAX(a,b);
62    a = MIN(a,c);
63    return a;
64}
65
66class GoogleProjection
67{
68    double *Ac, *Bc, *Cc, *zc;
69
70    public:
71        GoogleProjection(int levels=18) {
72            Ac = new double[levels];
73            Bc = new double[levels];
74            Cc = new double[levels];
75            zc = new double[levels];
76            int d, c = 256;
77            for (d=0; d<levels; d++) {
78                int e = c/2;
79                Bc[d] = c/360.0;
80                Cc[d] = c/(2 * M_PI);
81                zc[d] = e;
82                Ac[d] = c;
83                c *=2;
84            }
85        }
86
87        void fromLLtoPixel(double &x, double &y, int zoom) {
88            double d = zc[zoom];
89            double f = minmax(sin(DEG_TO_RAD * y),-0.9999,0.9999);
90            x = round(d + x * Bc[zoom]);
91            y = round(d + 0.5*log((1+f)/(1-f))*-Cc[zoom]);
92        }
93        void fromPixelToLL(double &x, double &y, int zoom) {
94            double e = zc[zoom];
95            double g = (y - e)/-Cc[zoom];
96            x = (x - e)/Bc[zoom];
97            y = RAD_TO_DEG * ( 2 * atan(exp(g)) - 0.5 * M_PI);
98        }
99};
100
101static GoogleProjection gprj(maxZoom+1);
102
103
104void display_rate(struct timeval start, struct timeval end, int num) 
105{
106    int d_s, d_us;
107    float sec;
108
109    d_s  = end.tv_sec  - start.tv_sec;
110    d_us = end.tv_usec - start.tv_usec;
111
112    sec = d_s + d_us / 1000000.0;
113
114    printf("Rendered %d tiles in %.2f seconds (%.2f tiles/s)\n", num, sec, num / sec);
115    fflush(NULL);
116}
117
118
119
120int rx_process(const struct protocol *req)
121{
122    fprintf(stderr, "version(%d), cmd(%d), z(%d), x(%d), y(%d)\n",
123            req->ver, req->cmd, req->z, req->x, req->y);
124    return 0;
125}
126
127int process_loop(int fd, int x, int y, int z)
128{
129    struct protocol cmd, rsp;
130    //struct pollfd fds[1];
131    int ret = 0;
132
133    bzero(&cmd, sizeof(cmd));
134
135    cmd.ver = 2;
136    cmd.cmd = cmdRender;
137    cmd.z = z;
138    cmd.x = x;
139    cmd.y = y;
140    strcpy(cmd.xmlname, XMLCONFIG_DEFAULT);
141    //strcpy(cmd.path, "/tmp/foo.png");
142
143        //printf("Sending request\n");
144    ret = send(fd, &cmd, sizeof(cmd), 0);
145    if (ret != sizeof(cmd)) {
146        perror("send error");
147    }
148        //printf("Waiting for response\n");
149    bzero(&rsp, sizeof(rsp));
150    ret = recv(fd, &rsp, sizeof(rsp), 0);
151    if (ret != sizeof(rsp)) {
152        perror("recv error");
153        return 0;
154    }
155        //printf("Got response\n");
156
157    if (!ret)
158        perror("Socket send error");
159    return ret;
160}
161
162
163int main(int argc, char **argv)
164{
165    const char *spath = RENDER_SOCKET;
166    int fd;
167    struct sockaddr_un addr;
168    int ret=0;
169    int z;
170    char name[PATH_MAX];
171    struct timeval start, end;
172    struct timeval start_all, end_all;
173    int num, num_all = 0;
174 
175   
176    fprintf(stderr, "Rendering client\n");
177
178    fd = socket(PF_UNIX, SOCK_STREAM, 0);
179    if (fd < 0) {
180        fprintf(stderr, "failed to create unix socket\n");
181        exit(2);
182    }
183
184    bzero(&addr, sizeof(addr));
185    addr.sun_family = AF_UNIX;
186    strncpy(addr.sun_path, spath, sizeof(addr.sun_path));
187
188    if (connect(fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
189        fprintf(stderr, "socket connect failed for: %s\n", spath);
190        close(fd);
191        exit(3);
192    }
193
194    // Render something to counter act the startup costs
195    // of obtaining the Postgis table extents
196
197    printf("Initial startup costs\n");
198    gettimeofday(&start, NULL);
199    process_loop(fd, 0,0,0);
200    gettimeofday(&end, NULL);
201    display_rate(start, end, 1);
202
203    gettimeofday(&start_all, NULL);
204
205    for (z=minZoom; z<=maxZoom; z++) {
206        double px0 = boundx0;
207        double py0 = boundy1;
208        double px1 = boundx1;
209        double py1 = boundy0;
210        gprj.fromLLtoPixel(px0, py0, z);
211        gprj.fromLLtoPixel(px1, py1, z);
212
213        int x, xmin, xmax;
214        xmin = (int)(px0/256.0);
215        xmax = (int)(px1/256.0);
216
217        int y, ymin, ymax;
218        ymin = (int)(py0/256.0);
219        ymax = (int)(py1/256.0);
220
221        num = (xmax - xmin + 1) * (ymax - ymin + 1);
222//        if (!num) {
223//            printf("No tiles at zoom(%d)\n", z);
224//            continue;
225//        }
226
227        printf("\nZoom(%d) Now rendering %d tiles\n", z, num);
228        num_all += num;
229        gettimeofday(&start, NULL);
230
231        for (x=xmin; x<=xmax; x++) {
232            for (y=ymin; y<=ymax; y++) {
233                struct stat s;
234                xyz_to_meta(name, sizeof(name), XMLCONFIG_DEFAULT, x, y, z);
235                if (stat(name, &s) < 0) {
236                // File doesn't exist
237                    ret = process_loop(fd, x, y, z);
238                }
239                //printf(".");
240                fflush(NULL);
241            }
242        }
243        //printf("\n");
244        gettimeofday(&end, NULL);
245        display_rate(start, end, num);
246    }
247    gettimeofday(&end_all, NULL);
248    printf("\nTotal for all tiles rendered\n");
249    display_rate(start_all, end_all, num_all);
250
251    close(fd);
252    return ret;
253}
254#endif
Note: See TracBrowser for help on using the repository browser.