Index: bench/RTreeBench.cpp |
diff --git a/bench/RTreeBench.cpp b/bench/RTreeBench.cpp |
index 08d6bf4bdb06c99d9899c8ca87480e6d707d512f..030d376017160ae740372e6a39168e46117b1a7a 100644 |
--- a/bench/RTreeBench.cpp |
+++ b/bench/RTreeBench.cpp |
@@ -1,4 +1,3 @@ |
- |
/* |
* Copyright 2012 Google Inc. |
* |
@@ -23,17 +22,10 @@ typedef SkRect (*MakeRectProc)(SkRandom&, int, int); |
// Time how long it takes to build an R-Tree either bulk-loaded or not |
class RTreeBuildBench : public Benchmark { |
public: |
- RTreeBuildBench(const char* name, MakeRectProc proc, bool bulkLoad, |
- SkRTree* tree) |
+ RTreeBuildBench(const char* name, MakeRectProc proc, SkRTree* tree) |
: fTree(tree) |
- , fProc(proc) |
- , fBulkLoad(bulkLoad) { |
- fName.append("rtree_"); |
- fName.append(name); |
- fName.append("_build"); |
- if (fBulkLoad) { |
- fName.append("_bulk"); |
- } |
+ , fProc(proc) { |
+ fName.printf("rtree_%s_build", name); |
} |
virtual bool isSuitableFor(Backend backend) SK_OVERRIDE { |
@@ -49,11 +41,14 @@ protected: |
} |
virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { |
SkRandom rand; |
+ SkAutoTMalloc<SkRect> rects(NUM_BUILD_RECTS); |
+ for (int i = 0; i < NUM_BUILD_RECTS; ++i) { |
+ rects[i] = fProc(rand, i, NUM_BUILD_RECTS); |
+ } |
+ |
for (int i = 0; i < loops; ++i) { |
- for (int j = 0; j < NUM_BUILD_RECTS; ++j) { |
- fTree->insert(j, fProc(rand, j, NUM_BUILD_RECTS), fBulkLoad); |
- } |
- fTree->flushDeferredInserts(); |
+ fTree->insert(&rects, NUM_BUILD_RECTS); |
+ SkASSERT(rects != NULL); // It'd break this bench if the tree took ownership of rects. |
fTree->clear(); |
} |
} |
@@ -61,32 +56,16 @@ private: |
SkRTree* fTree; |
MakeRectProc fProc; |
SkString fName; |
- bool fBulkLoad; |
typedef Benchmark INHERITED; |
}; |
// Time how long it takes to perform queries on an R-Tree, bulk-loaded or not |
class RTreeQueryBench : public Benchmark { |
public: |
- enum QueryType { |
- kSmall_QueryType, // small queries |
- kLarge_QueryType, // large queries |
- kRandom_QueryType,// randomly sized queries |
- kFull_QueryType // queries that cover everything |
- }; |
- |
- RTreeQueryBench(const char* name, MakeRectProc proc, bool bulkLoad, |
- QueryType q, SkRTree* tree) |
+ RTreeQueryBench(const char* name, MakeRectProc proc, SkRTree* tree) |
: fTree(tree) |
- , fProc(proc) |
- , fBulkLoad(bulkLoad) |
- , fQuery(q) { |
- fName.append("rtree_"); |
- fName.append(name); |
- fName.append("_query"); |
- if (fBulkLoad) { |
- fName.append("_bulk"); |
- } |
+ , fProc(proc) { |
+ fName.printf("rtree_%s_query", name); |
} |
virtual bool isSuitableFor(Backend backend) SK_OVERRIDE { |
@@ -102,10 +81,11 @@ protected: |
} |
virtual void onPreDraw() SK_OVERRIDE { |
SkRandom rand; |
- for (int j = 0; j < NUM_QUERY_RECTS; ++j) { |
- fTree->insert(j, fProc(rand, j, NUM_QUERY_RECTS), fBulkLoad); |
+ SkAutoTMalloc<SkRect> rects(NUM_QUERY_RECTS); |
+ for (int i = 0; i < NUM_QUERY_RECTS; ++i) { |
+ rects[i] = fProc(rand, i, NUM_QUERY_RECTS); |
} |
- fTree->flushDeferredInserts(); |
+ fTree->insert(&rects, NUM_QUERY_RECTS); |
} |
virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { |
@@ -113,33 +93,10 @@ protected: |
for (int i = 0; i < loops; ++i) { |
SkTDArray<unsigned> hits; |
SkRect query; |
- switch(fQuery) { |
- case kSmall_QueryType: |
- query.fLeft = rand.nextRangeF(0, GENERATE_EXTENTS); |
- query.fTop = rand.nextRangeF(0, GENERATE_EXTENTS); |
- query.fRight = query.fLeft + (GENERATE_EXTENTS / 20); |
- query.fBottom = query.fTop + (GENERATE_EXTENTS / 20); |
- break; |
- case kLarge_QueryType: |
- query.fLeft = rand.nextRangeF(0, GENERATE_EXTENTS); |
- query.fTop = rand.nextRangeF(0, GENERATE_EXTENTS); |
- query.fRight = query.fLeft + (GENERATE_EXTENTS / 2); |
- query.fBottom = query.fTop + (GENERATE_EXTENTS / 2); |
- break; |
- case kFull_QueryType: |
- query.fLeft = -GENERATE_EXTENTS; |
- query.fTop = -GENERATE_EXTENTS; |
- query.fRight = 2 * GENERATE_EXTENTS; |
- query.fBottom = 2 * GENERATE_EXTENTS; |
- break; |
- default: // fallthrough |
- case kRandom_QueryType: |
- query.fLeft = rand.nextRangeF(0, GENERATE_EXTENTS); |
- query.fTop = rand.nextRangeF(0, GENERATE_EXTENTS); |
- query.fRight = query.fLeft + 1 + rand.nextRangeF(0, GENERATE_EXTENTS/2); |
- query.fBottom = query.fTop + 1 + rand.nextRangeF(0, GENERATE_EXTENTS/2); |
- break; |
- }; |
+ query.fLeft = rand.nextRangeF(0, GENERATE_EXTENTS); |
+ query.fTop = rand.nextRangeF(0, GENERATE_EXTENTS); |
+ query.fRight = query.fLeft + 1 + rand.nextRangeF(0, GENERATE_EXTENTS/2); |
+ query.fBottom = query.fTop + 1 + rand.nextRangeF(0, GENERATE_EXTENTS/2); |
fTree->search(query, &hits); |
} |
} |
@@ -147,8 +104,6 @@ private: |
SkBBoxHierarchy* fTree; |
MakeRectProc fProc; |
SkString fName; |
- bool fBulkLoad; |
- QueryType fQuery; |
typedef Benchmark INHERITED; |
}; |
@@ -185,82 +140,40 @@ static inline SkRect make_random_rects(SkRandom& rand, int index, int numRects) |
/////////////////////////////////////////////////////////////////////////////// |
-DEF_BENCH( |
- return SkNEW_ARGS(RTreeBuildBench, ("XYordered", &make_XYordered_rects, false, |
- SkRTree::Create(5, 16))); |
-) |
-DEF_BENCH( |
- return SkNEW_ARGS(RTreeBuildBench, ("XYordered", &make_XYordered_rects, true, |
- SkRTree::Create(5, 16))); |
-) |
-DEF_BENCH( |
- return SkNEW_ARGS(RTreeBuildBench, ("(unsorted)XYordered", &make_XYordered_rects, true, |
- SkRTree::Create(5, 16, 1, false))); |
-) |
-DEF_BENCH( |
- return SkNEW_ARGS(RTreeQueryBench, ("XYordered", &make_XYordered_rects, true, |
- RTreeQueryBench::kRandom_QueryType, SkRTree::Create(5, 16))); |
-) |
-DEF_BENCH( |
- return SkNEW_ARGS(RTreeQueryBench, ("(unsorted)XYordered", &make_XYordered_rects, true, |
- RTreeQueryBench::kRandom_QueryType, SkRTree::Create(5, 16, 1, false))); |
-) |
- |
-DEF_BENCH( |
- return SkNEW_ARGS(RTreeBuildBench, ("YXordered", &make_YXordered_rects, false, |
- SkRTree::Create(5, 16))); |
-) |
-DEF_BENCH( |
- return SkNEW_ARGS(RTreeBuildBench, ("YXordered", &make_YXordered_rects, true, |
- SkRTree::Create(5, 16))); |
-) |
-DEF_BENCH( |
- return SkNEW_ARGS(RTreeBuildBench, ("(unsorted)YXordered", &make_YXordered_rects, true, |
- SkRTree::Create(5, 16, 1, false))); |
-) |
-DEF_BENCH( |
- return SkNEW_ARGS(RTreeQueryBench, ("YXordered", &make_YXordered_rects, true, |
- RTreeQueryBench::kRandom_QueryType, SkRTree::Create(5, 16))); |
-) |
-DEF_BENCH( |
- return SkNEW_ARGS(RTreeQueryBench, ("(unsorted)YXordered", &make_YXordered_rects, true, |
- RTreeQueryBench::kRandom_QueryType, SkRTree::Create(5, 16, 1, false))); |
-) |
- |
-DEF_BENCH( |
- return SkNEW_ARGS(RTreeBuildBench, ("random", &make_random_rects, false, |
- SkRTree::Create(5, 16))); |
-) |
-DEF_BENCH( |
- return SkNEW_ARGS(RTreeBuildBench, ("random", &make_random_rects, true, |
- SkRTree::Create(5, 16))); |
-) |
-DEF_BENCH( |
- return SkNEW_ARGS(RTreeBuildBench, ("(unsorted)random", &make_random_rects, true, |
- SkRTree::Create(5, 16, 1, false))); |
-) |
-DEF_BENCH( |
- return SkNEW_ARGS(RTreeQueryBench, ("random", &make_random_rects, true, |
- RTreeQueryBench::kRandom_QueryType, SkRTree::Create(5, 16))); |
-) |
-DEF_BENCH( |
- return SkNEW_ARGS(RTreeQueryBench, ("(unsorted)random", &make_random_rects, true, |
- RTreeQueryBench::kRandom_QueryType, SkRTree::Create(5, 16, 1, false))); |
-) |
- |
-DEF_BENCH( |
- return SkNEW_ARGS(RTreeBuildBench, ("concentric", |
- &make_concentric_rects_increasing, true, SkRTree::Create(5, 16))); |
-) |
-DEF_BENCH( |
- return SkNEW_ARGS(RTreeBuildBench, ("(unsorted)concentric", |
- &make_concentric_rects_increasing, true, SkRTree::Create(5, 16, 1, false))); |
-) |
-DEF_BENCH( |
- return SkNEW_ARGS(RTreeQueryBench, ("concentric", &make_concentric_rects_increasing, true, |
- RTreeQueryBench::kRandom_QueryType, SkRTree::Create(5, 16))); |
-) |
-DEF_BENCH( |
- return SkNEW_ARGS(RTreeQueryBench, ("(unsorted)concentric", &make_concentric_rects_increasing, true, |
- RTreeQueryBench::kRandom_QueryType, SkRTree::Create(5, 16, 1, false))); |
-) |
+DEF_BENCH(return SkNEW_ARGS(RTreeBuildBench, |
+ ("XY_sorted", &make_XYordered_rects, SkRTree::Create(5, 16)));) |
+DEF_BENCH(return SkNEW_ARGS(RTreeBuildBench, |
+ ("XY_unsorted", &make_XYordered_rects, SkRTree::Create(5, 16, 1, false)));) |
+DEF_BENCH(return SkNEW_ARGS(RTreeBuildBench, |
+ ("YX_sorted", &make_YXordered_rects, SkRTree::Create(5, 16)));) |
+DEF_BENCH(return SkNEW_ARGS(RTreeBuildBench, |
+ ("YX_unsorted", &make_YXordered_rects, SkRTree::Create(5, 16, 1, false)));) |
+DEF_BENCH(return SkNEW_ARGS(RTreeBuildBench, |
+ ("random_sorted", &make_random_rects, SkRTree::Create(5, 16)));) |
+DEF_BENCH(return SkNEW_ARGS(RTreeBuildBench, |
+ ("random_unsorted", &make_random_rects, SkRTree::Create(5, 16, 1, false)));) |
+DEF_BENCH(return SkNEW_ARGS(RTreeBuildBench, |
+ ("concentric_sorted", &make_concentric_rects_increasing, SkRTree::Create(5, 16)));) |
+DEF_BENCH(return SkNEW_ARGS(RTreeBuildBench, |
+ ("concentric_unsorted", |
+ &make_concentric_rects_increasing, |
+ SkRTree::Create(5, 16, 1, false)));) |
+ |
+DEF_BENCH(return SkNEW_ARGS(RTreeQueryBench, |
+ ("XY_sorted", &make_XYordered_rects, SkRTree::Create(5, 16)));) |
+DEF_BENCH(return SkNEW_ARGS(RTreeQueryBench, |
+ ("XY_unsorted", &make_XYordered_rects, SkRTree::Create(5, 16, 1, false)));) |
+DEF_BENCH(return SkNEW_ARGS(RTreeQueryBench, |
+ ("YX_sorted", &make_YXordered_rects, SkRTree::Create(5, 16)));) |
+DEF_BENCH(return SkNEW_ARGS(RTreeQueryBench, |
+ ("YX_unsorted", &make_YXordered_rects, SkRTree::Create(5, 16, 1, false)));) |
+DEF_BENCH(return SkNEW_ARGS(RTreeQueryBench, |
+ ("random_sorted", &make_random_rects, SkRTree::Create(5, 16)));) |
+DEF_BENCH(return SkNEW_ARGS(RTreeQueryBench, |
+ ("random_unsorted", &make_random_rects, SkRTree::Create(5, 16, 1, false)));) |
+DEF_BENCH(return SkNEW_ARGS(RTreeQueryBench, |
+ ("concentric_sorted", &make_concentric_rects_increasing, SkRTree::Create(5, 16)));) |
+DEF_BENCH(return SkNEW_ARGS(RTreeQueryBench, |
+ ("concentric_unsorted", |
+ &make_concentric_rects_increasing, |
+ SkRTree::Create(5, 16, 1, false)));) |