diff options
Diffstat (limited to 'bench/MathBench.cpp')
-rw-r--r-- | bench/MathBench.cpp | 76 |
1 files changed, 45 insertions, 31 deletions
diff --git a/bench/MathBench.cpp b/bench/MathBench.cpp index 32a89d64ef..c2b600c2a6 100644 --- a/bench/MathBench.cpp +++ b/bench/MathBench.cpp @@ -93,44 +93,58 @@ private: typedef MathBench INHERITED; }; -class SlowISqrtMathBench : public MathBench { +class InvSqrtBench : public SkBenchmark { + enum { + ARRAY = SkBENCHLOOP(1000), + LOOP = SkBENCHLOOP(5000), + }; + float fData[ARRAY]; + const char *type; + public: - SlowISqrtMathBench(void* param) : INHERITED(param, "slowIsqrt") {} + InvSqrtBench(void* param, const char *type) + : INHERITED(param) + , type(type) { + } + + // just so the compiler doesn't remove our loops + virtual void process(int) {} + protected: - virtual void performTest(float* SK_RESTRICT dst, - const float* SK_RESTRICT src, - int count) { - for (int i = 0; i < count; ++i) { - dst[i] = 1.0f / sk_float_sqrt(src[i]); + virtual void onPreDraw() SK_OVERRIDE { + SkRandom rand; + for (int i = 0; i < ARRAY; ++i) { + fData[i] = rand.nextRangeF(0, 10000); } + + fIsRendering = false; } -private: - typedef MathBench INHERITED; -}; -static inline float SkFastInvSqrt(float x) { - float xhalf = 0.5f*x; - int i = *SkTCast<int*>(&x); - i = 0x5f3759df - (i>>1); - x = *SkTCast<float*>(&i); - x = x*(1.5f-xhalf*x*x); -// x = x*(1.5f-xhalf*x*x); // this line takes err from 10^-3 to 10^-6 - return x; -} + virtual void onDraw(SkCanvas*) { + float accum = 0; -class FastISqrtMathBench : public MathBench { -public: - FastISqrtMathBench(void* param) : INHERITED(param, "fastIsqrt") {} -protected: - virtual void performTest(float* SK_RESTRICT dst, - const float* SK_RESTRICT src, - int count) { - for (int i = 0; i < count; ++i) { - dst[i] = SkFastInvSqrt(src[i]); + if (strcmp(type, "float_slow") == 0) { + for (int j = 0; j < LOOP; ++j) + for (int i = 0; i < ARRAY; ++i) + accum += 1.0f / sk_float_sqrt(fData[i]); + } else if (strcmp(type, "float_fast") == 0) { + for (int j = 0; j < LOOP; ++j) + for (int i = 0; i < ARRAY; ++i) + accum += SkFloatInvSqrt(fData[i]); } + + this->process(accum); + } + + virtual const char* onGetName() { + fName.printf("math_inv_sqrt"); + fName.appendf("_%s", type); + return fName.c_str(); } + private: - typedef MathBench INHERITED; + SkString fName; + typedef SkBenchmark INHERITED; }; static inline uint32_t QMul64(uint32_t value, U8CPU alpha) { @@ -523,8 +537,8 @@ private: /////////////////////////////////////////////////////////////////////////////// DEF_BENCH( return new NoOpMathBench(p); ) -DEF_BENCH( return new SlowISqrtMathBench(p); ) -DEF_BENCH( return new FastISqrtMathBench(p); ) +DEF_BENCH( return new InvSqrtBench(p, "float_slow"); ) +DEF_BENCH( return new InvSqrtBench(p, "float_fast"); ) DEF_BENCH( return new QMul64Bench(p); ) DEF_BENCH( return new QMul32Bench(p); ) |