/* * Copyright 2014 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "Benchmark.h" #include "SkCanvas.h" #include "SkRandom.h" #include "SkString.h" #if SK_SUPPORT_GPU #include "GrOrderedSet.h" static const int NUM_ELEMENTS = 1000; // Time how long it takes to build a set class GrOrderedSetBuildBench : public Benchmark { public: GrOrderedSetBuildBench() { fName.append("ordered_set_build"); } virtual bool isSuitableFor(Backend backend) SK_OVERRIDE { return kNonRendering_Backend == backend; } virtual ~GrOrderedSetBuildBench() {} protected: virtual const char* onGetName() SK_OVERRIDE { return fName.c_str(); } virtual void onPreDraw() SK_OVERRIDE { SkRandom rand; for (int j = 0; j < NUM_ELEMENTS; ++j) { fData[j] = rand.nextU() % NUM_ELEMENTS; } } virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { for (int i = 0; i < loops; ++i) { GrOrderedSet<int> set; for (int j = 0; j < NUM_ELEMENTS; ++j) { set.insert(fData[j]); } set.reset(); } } private: SkString fName; int fData[NUM_ELEMENTS]; typedef Benchmark INHERITED; }; // Time how long it takes to find elements in a set class GrOrderedSetFindBench : public Benchmark { public: GrOrderedSetFindBench() { fName.append("ordered_set_find"); } virtual bool isSuitableFor(Backend backend) SK_OVERRIDE { return kNonRendering_Backend == backend; } virtual ~GrOrderedSetFindBench() {} protected: virtual const char* onGetName() SK_OVERRIDE { return fName.c_str(); } virtual void onPreDraw() SK_OVERRIDE { SkRandom rand; for (int j = 0; j < NUM_ELEMENTS; ++j) { fData[j] = rand.nextU() % 1500; fSet.insert(rand.nextU() % NUM_ELEMENTS); } } virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { for (int i = 0; i < loops; ++i) { for (int j = 0; j < NUM_ELEMENTS; ++j) { fSet.find(fData[j]); } } } private: SkString fName; int fData[NUM_ELEMENTS]; GrOrderedSet<int> fSet; typedef Benchmark INHERITED; }; // Time how long it takes to iterate over and remove all elements from set class GrOrderedSetRemoveBench : public Benchmark { public: GrOrderedSetRemoveBench() { fName.append("ordered_set_remove"); } virtual bool isSuitableFor(Backend backend) SK_OVERRIDE { return kNonRendering_Backend == backend; } virtual ~GrOrderedSetRemoveBench() {} protected: virtual const char* onGetName() SK_OVERRIDE { return fName.c_str(); } virtual void onPreDraw() SK_OVERRIDE { SkRandom rand; for (int j = 0; j < NUM_ELEMENTS; ++j) { fSet.insert(rand.nextU() % NUM_ELEMENTS); } } virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { typedef GrOrderedSet<int>::Iter SetIter; for (int i = 0; i < loops; ++i) { GrOrderedSet<int> testSet; for (SetIter s = fSet.begin(); fSet.end() != s; ++s) { testSet.insert(*s); } for (int j = 0; j < NUM_ELEMENTS; ++j) { testSet.remove(testSet.find(j)); } } } private: SkString fName; GrOrderedSet<int> fSet; typedef Benchmark INHERITED; }; /////////////////////////////////////////////////////////////////////////////// DEF_BENCH(return SkNEW_ARGS(GrOrderedSetBuildBench, ());) DEF_BENCH(return SkNEW_ARGS(GrOrderedSetFindBench, ());) DEF_BENCH(return SkNEW_ARGS(GrOrderedSetRemoveBench, ());) #endif