diff options
Diffstat (limited to 'bench/MathBench.cpp')
-rw-r--r-- | bench/MathBench.cpp | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/bench/MathBench.cpp b/bench/MathBench.cpp index 7768253544..1ae683aab8 100644 --- a/bench/MathBench.cpp +++ b/bench/MathBench.cpp @@ -598,3 +598,67 @@ DEF_BENCH( return new CLZBench(true); ) DEF_BENCH( return new NormalizeBench(); ) DEF_BENCH( return new FixedMathBench(); ) + +////////////////////////////////////////////////////////////// + +#include "../private/SkFloatBits.h" +class Floor2IntBench : public Benchmark { + enum { + ARRAY = 1000, + }; + float fData[ARRAY]; + const bool fSat; +public: + + Floor2IntBench(bool sat) : fSat(sat) { + SkRandom rand; + + for (int i = 0; i < ARRAY; ++i) { + fData[i] = SkBits2Float(rand.nextU()); + } + + if (sat) { + fName = "floor2int_sat"; + } else { + fName = "floor2int_undef"; + } + } + + bool isSuitableFor(Backend backend) override { + return backend == kNonRendering_Backend; + } + + // These exist to try to stop the compiler from detecting what we doing, and throwing + // parts away (or knowing exactly how big the loop counts are). + virtual void process(int) {} + virtual int count() { return ARRAY; } + +protected: + void onDraw(int loops, SkCanvas*) override { + int accum = 0; + + for (int j = 0; j < loops; ++j) { + int n = this->count(); + if (fSat) { + for (int i = 0; i < n; ++i) { + accum += sk_float_floor2int(fData[i]); + } + } else { + for (int i = 0; i < n; ++i) { + accum += sk_float_floor2int_no_saturate(fData[i]); + } + } + this->process(accum); + } + } + + const char* onGetName() override { return fName; } + +private: + const char* fName; + + typedef Benchmark INHERITED; +}; +DEF_BENCH( return new Floor2IntBench(false); ) +DEF_BENCH( return new Floor2IntBench(true); ) + |