blob: 030d376017160ae740372e6a39168e46117b1a7a [file] [log] [blame]
rileya@google.com981b33a2012-09-05 18:36:17 +00001/*
2 * Copyright 2012 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
tfarinaf168b862014-06-19 12:32:29 -07008#include "Benchmark.h"
rileya@google.com981b33a2012-09-05 18:36:17 +00009#include "SkCanvas.h"
10#include "SkRTree.h"
11#include "SkRandom.h"
12#include "SkString.h"
13
14// confine rectangles to a smallish area, so queries generally hit something, and overlap occurs:
mtklein533eb782014-08-27 10:39:42 -070015static const SkScalar GENERATE_EXTENTS = 1000.0f;
rileya@google.com981b33a2012-09-05 18:36:17 +000016static const int NUM_BUILD_RECTS = 500;
17static const int NUM_QUERY_RECTS = 5000;
sglez@google.com8c902122013-08-30 17:27:47 +000018static const int GRID_WIDTH = 100;
rileya@google.com981b33a2012-09-05 18:36:17 +000019
mtklein533eb782014-08-27 10:39:42 -070020typedef SkRect (*MakeRectProc)(SkRandom&, int, int);
rileya@google.com981b33a2012-09-05 18:36:17 +000021
22// Time how long it takes to build an R-Tree either bulk-loaded or not
tfarinaf168b862014-06-19 12:32:29 -070023class RTreeBuildBench : public Benchmark {
rileya@google.com981b33a2012-09-05 18:36:17 +000024public:
mtklein4477c3c2014-10-27 10:27:10 -070025 RTreeBuildBench(const char* name, MakeRectProc proc, SkRTree* tree)
mtklein@google.com410e6e82013-09-13 19:52:27 +000026 : fTree(tree)
mtklein4477c3c2014-10-27 10:27:10 -070027 , fProc(proc) {
28 fName.printf("rtree_%s_build", name);
rileya@google.com61348d12012-09-06 13:38:53 +000029 }
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000030
31 virtual bool isSuitableFor(Backend backend) SK_OVERRIDE {
32 return backend == kNonRendering_Backend;
33 }
34
commit-bot@chromium.orgb2db4432014-04-23 21:03:45 +000035 virtual ~RTreeBuildBench() {
rileya@google.com48134582012-09-11 15:41:50 +000036 fTree->unref();
robertphillips@google.com07a05d52012-09-11 11:54:07 +000037 }
rileya@google.com981b33a2012-09-05 18:36:17 +000038protected:
commit-bot@chromium.org7fb83c82013-08-01 15:58:07 +000039 virtual const char* onGetName() SK_OVERRIDE {
rileya@google.com61348d12012-09-06 13:38:53 +000040 return fName.c_str();
rileya@google.com981b33a2012-09-05 18:36:17 +000041 }
commit-bot@chromium.org33614712013-12-03 18:17:16 +000042 virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +000043 SkRandom rand;
mtklein4477c3c2014-10-27 10:27:10 -070044 SkAutoTMalloc<SkRect> rects(NUM_BUILD_RECTS);
45 for (int i = 0; i < NUM_BUILD_RECTS; ++i) {
46 rects[i] = fProc(rand, i, NUM_BUILD_RECTS);
47 }
48
commit-bot@chromium.org33614712013-12-03 18:17:16 +000049 for (int i = 0; i < loops; ++i) {
mtklein4477c3c2014-10-27 10:27:10 -070050 fTree->insert(&rects, NUM_BUILD_RECTS);
51 SkASSERT(rects != NULL); // It'd break this bench if the tree took ownership of rects.
rileya@google.com981b33a2012-09-05 18:36:17 +000052 fTree->clear();
53 }
54 }
55private:
mtklein8f8c25e2014-10-02 09:53:04 -070056 SkRTree* fTree;
rileya@google.com981b33a2012-09-05 18:36:17 +000057 MakeRectProc fProc;
rileya@google.com61348d12012-09-06 13:38:53 +000058 SkString fName;
tfarinaf168b862014-06-19 12:32:29 -070059 typedef Benchmark INHERITED;
rileya@google.com981b33a2012-09-05 18:36:17 +000060};
61
62// Time how long it takes to perform queries on an R-Tree, bulk-loaded or not
tfarinaf168b862014-06-19 12:32:29 -070063class RTreeQueryBench : public Benchmark {
rileya@google.com981b33a2012-09-05 18:36:17 +000064public:
mtklein4477c3c2014-10-27 10:27:10 -070065 RTreeQueryBench(const char* name, MakeRectProc proc, SkRTree* tree)
mtklein@google.com410e6e82013-09-13 19:52:27 +000066 : fTree(tree)
mtklein4477c3c2014-10-27 10:27:10 -070067 , fProc(proc) {
68 fName.printf("rtree_%s_query", name);
rileya@google.com981b33a2012-09-05 18:36:17 +000069 }
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000070
71 virtual bool isSuitableFor(Backend backend) SK_OVERRIDE {
72 return backend == kNonRendering_Backend;
73 }
74
commit-bot@chromium.orgb2db4432014-04-23 21:03:45 +000075 virtual ~RTreeQueryBench() {
rileya@google.com48134582012-09-11 15:41:50 +000076 fTree->unref();
robertphillips@google.com07a05d52012-09-11 11:54:07 +000077 }
rileya@google.com981b33a2012-09-05 18:36:17 +000078protected:
commit-bot@chromium.org7fb83c82013-08-01 15:58:07 +000079 virtual const char* onGetName() SK_OVERRIDE {
rileya@google.com61348d12012-09-06 13:38:53 +000080 return fName.c_str();
rileya@google.com981b33a2012-09-05 18:36:17 +000081 }
commit-bot@chromium.org7fb83c82013-08-01 15:58:07 +000082 virtual void onPreDraw() SK_OVERRIDE {
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +000083 SkRandom rand;
mtklein4477c3c2014-10-27 10:27:10 -070084 SkAutoTMalloc<SkRect> rects(NUM_QUERY_RECTS);
85 for (int i = 0; i < NUM_QUERY_RECTS; ++i) {
86 rects[i] = fProc(rand, i, NUM_QUERY_RECTS);
commit-bot@chromium.org7fb83c82013-08-01 15:58:07 +000087 }
mtklein4477c3c2014-10-27 10:27:10 -070088 fTree->insert(&rects, NUM_QUERY_RECTS);
commit-bot@chromium.org7fb83c82013-08-01 15:58:07 +000089 }
90
commit-bot@chromium.org33614712013-12-03 18:17:16 +000091 virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +000092 SkRandom rand;
commit-bot@chromium.org33614712013-12-03 18:17:16 +000093 for (int i = 0; i < loops; ++i) {
mtklein6bd41962014-10-02 07:41:56 -070094 SkTDArray<unsigned> hits;
mtklein533eb782014-08-27 10:39:42 -070095 SkRect query;
mtklein4477c3c2014-10-27 10:27:10 -070096 query.fLeft = rand.nextRangeF(0, GENERATE_EXTENTS);
97 query.fTop = rand.nextRangeF(0, GENERATE_EXTENTS);
98 query.fRight = query.fLeft + 1 + rand.nextRangeF(0, GENERATE_EXTENTS/2);
99 query.fBottom = query.fTop + 1 + rand.nextRangeF(0, GENERATE_EXTENTS/2);
rileya@google.com981b33a2012-09-05 18:36:17 +0000100 fTree->search(query, &hits);
101 }
102 }
103private:
104 SkBBoxHierarchy* fTree;
105 MakeRectProc fProc;
rileya@google.com61348d12012-09-06 13:38:53 +0000106 SkString fName;
tfarinaf168b862014-06-19 12:32:29 -0700107 typedef Benchmark INHERITED;
rileya@google.com981b33a2012-09-05 18:36:17 +0000108};
109
mtklein533eb782014-08-27 10:39:42 -0700110static inline SkRect make_concentric_rects_increasing(SkRandom&, int index, int numRects) {
111 SkRect out = SkRect::MakeWH(SkIntToScalar(index+1), SkIntToScalar(index+1));
rileya@google.com981b33a2012-09-05 18:36:17 +0000112 return out;
113}
114
mtklein533eb782014-08-27 10:39:42 -0700115static inline SkRect make_XYordered_rects(SkRandom& rand, int index, int numRects) {
116 SkRect out;
117 out.fLeft = SkIntToScalar(index % GRID_WIDTH);
118 out.fTop = SkIntToScalar(index / GRID_WIDTH);
119 out.fRight = out.fLeft + 1 + rand.nextRangeF(0, GENERATE_EXTENTS/3);
120 out.fBottom = out.fTop + 1 + rand.nextRangeF(0, GENERATE_EXTENTS/3);
sglez@google.com8c902122013-08-30 17:27:47 +0000121 return out;
122}
mtklein533eb782014-08-27 10:39:42 -0700123static inline SkRect make_YXordered_rects(SkRandom& rand, int index, int numRects) {
124 SkRect out;
125 out.fLeft = SkIntToScalar(index / GRID_WIDTH);
126 out.fTop = SkIntToScalar(index % GRID_WIDTH);
127 out.fRight = out.fLeft + 1 + rand.nextRangeF(0, GENERATE_EXTENTS/3);
128 out.fBottom = out.fTop + 1 + rand.nextRangeF(0, GENERATE_EXTENTS/3);
sglez@google.com8c902122013-08-30 17:27:47 +0000129 return out;
130}
131
mtklein533eb782014-08-27 10:39:42 -0700132static inline SkRect make_random_rects(SkRandom& rand, int index, int numRects) {
133 SkRect out;
134 out.fLeft = rand.nextRangeF(0, GENERATE_EXTENTS);
135 out.fTop = rand.nextRangeF(0, GENERATE_EXTENTS);
136 out.fRight = out.fLeft + 1 + rand.nextRangeF(0, GENERATE_EXTENTS/5);
137 out.fBottom = out.fTop + 1 + rand.nextRangeF(0, GENERATE_EXTENTS/5);
rileya@google.com981b33a2012-09-05 18:36:17 +0000138 return out;
139}
140
rileya@google.com981b33a2012-09-05 18:36:17 +0000141///////////////////////////////////////////////////////////////////////////////
142
mtklein4477c3c2014-10-27 10:27:10 -0700143DEF_BENCH(return SkNEW_ARGS(RTreeBuildBench,
144 ("XY_sorted", &make_XYordered_rects, SkRTree::Create(5, 16)));)
145DEF_BENCH(return SkNEW_ARGS(RTreeBuildBench,
146 ("XY_unsorted", &make_XYordered_rects, SkRTree::Create(5, 16, 1, false)));)
147DEF_BENCH(return SkNEW_ARGS(RTreeBuildBench,
148 ("YX_sorted", &make_YXordered_rects, SkRTree::Create(5, 16)));)
149DEF_BENCH(return SkNEW_ARGS(RTreeBuildBench,
150 ("YX_unsorted", &make_YXordered_rects, SkRTree::Create(5, 16, 1, false)));)
151DEF_BENCH(return SkNEW_ARGS(RTreeBuildBench,
152 ("random_sorted", &make_random_rects, SkRTree::Create(5, 16)));)
153DEF_BENCH(return SkNEW_ARGS(RTreeBuildBench,
154 ("random_unsorted", &make_random_rects, SkRTree::Create(5, 16, 1, false)));)
155DEF_BENCH(return SkNEW_ARGS(RTreeBuildBench,
156 ("concentric_sorted", &make_concentric_rects_increasing, SkRTree::Create(5, 16)));)
157DEF_BENCH(return SkNEW_ARGS(RTreeBuildBench,
158 ("concentric_unsorted",
159 &make_concentric_rects_increasing,
160 SkRTree::Create(5, 16, 1, false)));)
rileya@google.com981b33a2012-09-05 18:36:17 +0000161
mtklein4477c3c2014-10-27 10:27:10 -0700162DEF_BENCH(return SkNEW_ARGS(RTreeQueryBench,
163 ("XY_sorted", &make_XYordered_rects, SkRTree::Create(5, 16)));)
164DEF_BENCH(return SkNEW_ARGS(RTreeQueryBench,
165 ("XY_unsorted", &make_XYordered_rects, SkRTree::Create(5, 16, 1, false)));)
166DEF_BENCH(return SkNEW_ARGS(RTreeQueryBench,
167 ("YX_sorted", &make_YXordered_rects, SkRTree::Create(5, 16)));)
168DEF_BENCH(return SkNEW_ARGS(RTreeQueryBench,
169 ("YX_unsorted", &make_YXordered_rects, SkRTree::Create(5, 16, 1, false)));)
170DEF_BENCH(return SkNEW_ARGS(RTreeQueryBench,
171 ("random_sorted", &make_random_rects, SkRTree::Create(5, 16)));)
172DEF_BENCH(return SkNEW_ARGS(RTreeQueryBench,
173 ("random_unsorted", &make_random_rects, SkRTree::Create(5, 16, 1, false)));)
174DEF_BENCH(return SkNEW_ARGS(RTreeQueryBench,
175 ("concentric_sorted", &make_concentric_rects_increasing, SkRTree::Create(5, 16)));)
176DEF_BENCH(return SkNEW_ARGS(RTreeQueryBench,
177 ("concentric_unsorted",
178 &make_concentric_rects_increasing,
179 SkRTree::Create(5, 16, 1, false)));)