fix crash when copy'ing latent plugins
[ardour.git] / libs / canvas / benchmark / items_at_point.cc
1 #include <sys/time.h>
2 #include "canvas/group.h"
3 #include "canvas/canvas.h"
4 #include "canvas/root_group.h"
5 #include "canvas/rectangle.h"
6 #include "benchmark.h"
7
8 using namespace std;
9 using namespace ArdourCanvas;
10
11 static void
12 test (int items_per_cell)
13 {
14         Group::default_items_per_cell = items_per_cell;
15
16         int const n_rectangles = 10000;
17         int const n_tests = 1000;
18         double const rough_size = 1000;
19         srand (1);
20
21         ImageCanvas canvas;
22
23         list<Item*> rectangles;
24
25         for (int i = 0; i < n_rectangles; ++i) {
26                 rectangles.push_back (new Rectangle (canvas.root(), rect_random (rough_size)));
27         }
28
29         for (int i = 0; i < n_tests; ++i) {
30                 Duple test (double_random() * rough_size, double_random() * rough_size);
31
32                 /* ask the group what's at this point */
33                 vector<Item const *> items;
34                 canvas.root()->add_items_at_point (test, items);
35         }
36 }
37
38 int main ()
39 {
40         int tests[] = { 1, 2, 4, 8, 16, 32, 64, 128, 256 };
41
42         for (unsigned int i = 0; i < sizeof (tests) / sizeof (int); ++i) {
43                 timeval start;
44                 timeval stop;
45
46                 gettimeofday (&start, 0);
47                 test (tests[i]);
48                 gettimeofday (&stop, 0);
49
50                 int sec = stop.tv_sec - start.tv_sec;
51                 int usec = stop.tv_usec - start.tv_usec;
52                 if (usec < 0) {
53                         --sec;
54                         usec += 1e6;
55                 }
56
57                 double seconds = sec + ((double) usec / 1e6);
58
59                 cout << "Test " << tests[i] << ": " << seconds << "\n";
60         }
61 }
62