diff options
Diffstat (limited to 'bench/MatrixBench.cpp')
-rw-r--r-- | bench/MatrixBench.cpp | 98 |
1 files changed, 74 insertions, 24 deletions
diff --git a/bench/MatrixBench.cpp b/bench/MatrixBench.cpp index dce0358..a2e459a 100644 --- a/bench/MatrixBench.cpp +++ b/bench/MatrixBench.cpp @@ -1,3 +1,10 @@ + +/* + * Copyright 2011 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ #include "SkBenchmark.h" #include "SkMatrix.h" #include "SkRandom.h" @@ -21,7 +28,7 @@ protected: } virtual void onDraw(SkCanvas* canvas) { - int n = N * this->mulLoopCount(); + int n = SkBENCHLOOP(N * this->mulLoopCount()); for (int i = 0; i < n; i++) { this->performTest(); } @@ -56,9 +63,6 @@ protected: always_do(m0 == m1); always_do(m1 == m2); always_do(m2 == m0); - always_do(m0.getType()); - always_do(m1.getType()); - always_do(m2.getType()); } private: typedef MatrixBench INHERITED; @@ -214,26 +218,71 @@ private: typedef MatrixBench INHERITED; }; +class GetTypeMatrixBench : public MatrixBench { +public: + GetTypeMatrixBench(void* param) + : INHERITED(param, "gettype") { + fArray[0] = (float) fRnd.nextS(); + fArray[1] = (float) fRnd.nextS(); + fArray[2] = (float) fRnd.nextS(); + fArray[3] = (float) fRnd.nextS(); + fArray[4] = (float) fRnd.nextS(); + fArray[5] = (float) fRnd.nextS(); + fArray[6] = (float) fRnd.nextS(); + fArray[7] = (float) fRnd.nextS(); + fArray[8] = (float) fRnd.nextS(); + } +protected: + // Putting random generation of the matrix inside performTest() + // would help us avoid anomalous runs, but takes up 25% or + // more of the function time. + virtual void performTest() { + fMatrix.setAll(fArray[0], fArray[1], fArray[2], + fArray[3], fArray[4], fArray[5], + fArray[6], fArray[7], fArray[8]); + always_do(fMatrix.getType()); + fMatrix.dirtyMatrixTypeCache(); + always_do(fMatrix.getType()); + fMatrix.dirtyMatrixTypeCache(); + always_do(fMatrix.getType()); + fMatrix.dirtyMatrixTypeCache(); + always_do(fMatrix.getType()); + fMatrix.dirtyMatrixTypeCache(); + always_do(fMatrix.getType()); + fMatrix.dirtyMatrixTypeCache(); + always_do(fMatrix.getType()); + fMatrix.dirtyMatrixTypeCache(); + always_do(fMatrix.getType()); + fMatrix.dirtyMatrixTypeCache(); + always_do(fMatrix.getType()); + } +private: + SkMatrix fMatrix; + float fArray[9]; + SkRandom fRnd; + typedef MatrixBench INHERITED; +}; + #ifdef SK_SCALAR_IS_FLOAT class ScaleTransMixedMatrixBench : public MatrixBench { public: ScaleTransMixedMatrixBench(void* p) : INHERITED(p, "scaletrans_mixed"), fCount (16) { - fMatrix.setAll(fRandom.nextS(), fRandom.nextS(), fRandom.nextS(), - fRandom.nextS(), fRandom.nextS(), fRandom.nextS(), - fRandom.nextS(), fRandom.nextS(), fRandom.nextS()); + fMatrix.setAll(fRandom.nextSScalar1(), fRandom.nextSScalar1(), fRandom.nextSScalar1(), + fRandom.nextSScalar1(), fRandom.nextSScalar1(), fRandom.nextSScalar1(), + fRandom.nextSScalar1(), fRandom.nextSScalar1(), fRandom.nextSScalar1()); int i; - for (i = 0; i < fCount; i++) { - fSrc[i].fX = fRandom.nextS(); - fSrc[i].fY = fRandom.nextS(); - fDst[i].fX = fRandom.nextS(); - fDst[i].fY = fRandom.nextS(); + for (i = 0; i < SkBENCHLOOP(fCount); i++) { + fSrc[i].fX = fRandom.nextSScalar1(); + fSrc[i].fY = fRandom.nextSScalar1(); + fDst[i].fX = fRandom.nextSScalar1(); + fDst[i].fY = fRandom.nextSScalar1(); } } protected: virtual void performTest() { SkPoint* dst = fDst; const SkPoint* src = fSrc; - int count = fCount; + int count = SkBENCHLOOP(fCount); float mx = fMatrix[SkMatrix::kMScaleX]; float my = fMatrix[SkMatrix::kMScaleY]; float tx = fMatrix[SkMatrix::kMTransX]; @@ -254,29 +303,28 @@ class ScaleTransMixedMatrixBench : public MatrixBench { typedef MatrixBench INHERITED; }; - class ScaleTransDoubleMatrixBench : public MatrixBench { public: ScaleTransDoubleMatrixBench(void* p) : INHERITED(p, "scaletrans_double"), fCount (16) { init9(fMatrix); int i; - for (i = 0; i < fCount; i++) { - fSrc[i].fX = fRandom.nextS(); - fSrc[i].fY = fRandom.nextS(); - fDst[i].fX = fRandom.nextS(); - fDst[i].fY = fRandom.nextS(); + for (i = 0; i < SkBENCHLOOP(fCount); i++) { + fSrc[i].fX = fRandom.nextSScalar1(); + fSrc[i].fY = fRandom.nextSScalar1(); + fDst[i].fX = fRandom.nextSScalar1(); + fDst[i].fY = fRandom.nextSScalar1(); } } protected: virtual void performTest() { SkPoint* dst = fDst; const SkPoint* src = fSrc; - int count = fCount; + int count = SkBENCHLOOP(fCount); // As doubles, on Z600 Linux systems this is 2.5x as expensive as mixed mode - float mx = fMatrix[SkMatrix::kMScaleX]; - float my = fMatrix[SkMatrix::kMScaleY]; - float tx = fMatrix[SkMatrix::kMTransX]; - float ty = fMatrix[SkMatrix::kMTransY]; + float mx = (float) fMatrix[SkMatrix::kMScaleX]; + float my = (float) fMatrix[SkMatrix::kMScaleY]; + float tx = (float) fMatrix[SkMatrix::kMTransX]; + float ty = (float) fMatrix[SkMatrix::kMTransY]; do { dst->fY = src->fY * my + ty; dst->fX = src->fX * mx + tx; @@ -303,12 +351,14 @@ static SkBenchmark* M1(void* p) { return new ScaleMatrixBench(p); } static SkBenchmark* M2(void* p) { return new FloatConcatMatrixBench(p); } static SkBenchmark* M3(void* p) { return new FloatDoubleConcatMatrixBench(p); } static SkBenchmark* M4(void* p) { return new DoubleConcatMatrixBench(p); } +static SkBenchmark* M5(void* p) { return new GetTypeMatrixBench(p); } static BenchRegistry gReg0(M0); static BenchRegistry gReg1(M1); static BenchRegistry gReg2(M2); static BenchRegistry gReg3(M3); static BenchRegistry gReg4(M4); +static BenchRegistry gReg5(M5); #ifdef SK_SCALAR_IS_FLOAT static SkBenchmark* FlM0(void* p) { return new ScaleTransMixedMatrixBench(p); } |