summaryrefslogtreecommitdiff
path: root/libs/canvas/benchmark/items_at_point.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/canvas/benchmark/items_at_point.cc')
-rw-r--r--libs/canvas/benchmark/items_at_point.cc62
1 files changed, 62 insertions, 0 deletions
diff --git a/libs/canvas/benchmark/items_at_point.cc b/libs/canvas/benchmark/items_at_point.cc
new file mode 100644
index 0000000000..db0c5343b2
--- /dev/null
+++ b/libs/canvas/benchmark/items_at_point.cc
@@ -0,0 +1,62 @@
+#include <sys/time.h>
+#include "canvas/group.h"
+#include "canvas/canvas.h"
+#include "canvas/root_group.h"
+#include "canvas/rectangle.h"
+#include "benchmark.h"
+
+using namespace std;
+using namespace ArdourCanvas;
+
+static void
+test (int items_per_cell)
+{
+ Group::default_items_per_cell = items_per_cell;
+
+ int const n_rectangles = 10000;
+ int const n_tests = 1000;
+ double const rough_size = 1000;
+ srand (1);
+
+ ImageCanvas canvas;
+
+ list<Item*> rectangles;
+
+ for (int i = 0; i < n_rectangles; ++i) {
+ rectangles.push_back (new Rectangle (canvas.root(), rect_random (rough_size)));
+ }
+
+ for (int i = 0; i < n_tests; ++i) {
+ Duple test (double_random() * rough_size, double_random() * rough_size);
+
+ /* ask the group what's at this point */
+ vector<Item const *> items;
+ canvas.root()->add_items_at_point (test, items);
+ }
+}
+
+int main ()
+{
+ int tests[] = { 1, 2, 4, 8, 16, 32, 64, 128, 256 };
+
+ for (unsigned int i = 0; i < sizeof (tests) / sizeof (int); ++i) {
+ timeval start;
+ timeval stop;
+
+ gettimeofday (&start, 0);
+ test (tests[i]);
+ gettimeofday (&stop, 0);
+
+ int sec = stop.tv_sec - start.tv_sec;
+ int usec = stop.tv_usec - start.tv_usec;
+ if (usec < 0) {
+ --sec;
+ usec += 1e6;
+ }
+
+ double seconds = sec + ((double) usec / 1e6);
+
+ cout << "Test " << tests[i] << ": " << seconds << "\n";
+ }
+}
+