#include #include #include #include #include #define N_INIT 100 #define N_STEP 200 #define N_MAX 3000 #define REPEATS 3 #define WIDTH 1000 #define HEIGHT 400 int main (int argc, char* argv[]) { double data[N_MAX]; int i, j, n; GtkWidget* window; GtkWidget* image; GdkPixmap* pixmap; cairo_t* cr; for (i = 0; i < N_MAX; ++i) { data[i] = (double)rand() / RAND_MAX * HEIGHT; } gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect(G_OBJECT(window), "delete-event", G_CALLBACK(gtk_main_quit), NULL); gtk_widget_show_all(window); pixmap = gdk_pixmap_new(window->window, WIDTH, HEIGHT, -1); cr = gdk_cairo_create(pixmap); 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_set_source_rgb(cr, 1, 1, 1); cairo_rectangle(cr, 0, 0, WIDTH, HEIGHT); cairo_fill(cr); clock_gettime(CLOCK_MONOTONIC, &begin); cairo_set_source_rgb(cr, 0.4, 0.8, 0.4); cairo_set_line_width(cr, 1); 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); 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)); } image = gtk_image_new_from_pixmap(pixmap, NULL); gtk_container_add(GTK_CONTAINER(window), image); gtk_widget_show(image); gtk_main(); return 0; }