#include #include #include #include #define N_INIT 100 #define N_STEP 100 #define N_MAX 1000 #define REPEATS 100 #define WIDTH 1000 #define HEIGHT 400 int main (int argc, char* argv[]) { double data[N_MAX]; int i, j, n; for (i = 0; i < N_MAX; ++i) { data[i] = (double)rand() / RAND_MAX * HEIGHT; } printf("N_INIT=%d; N_STEP=%d; N_MAX=%d; REPEATS=%d\n", N_INIT, N_STEP, N_MAX, REPEATS); for (n = N_INIT; n <= N_MAX; n += N_STEP) { struct timespec begin, end; long long beginll, endll; cairo_surface_t* surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, WIDTH, HEIGHT); cairo_t* cr = cairo_create(surface); clock_gettime(CLOCK_MONOTONIC, &begin); cairo_set_source_rgb(cr, 0.4, 0.8, 0.4); for (j = 0; j < REPEATS; ++j) { cairo_new_path(cr); cairo_move_to(cr, 0, data[0]); for (i = 0; i < n; ++i) { cairo_line_to(cr, (double)i / n * WIDTH, data[i]); } cairo_stroke(cr); } clock_gettime(CLOCK_MONOTONIC, &end); cairo_destroy(cr); cairo_surface_destroy(surface); beginll = (long long)begin.tv_sec * 1000000000 + begin.tv_nsec; endll = (long long)end.tv_sec * 1000000000 + end.tv_nsec; printf("%d dots: %.4lf ns\n", n, (double)(endll - beginll) / (n * REPEATS)); } return 0; }