aboutsummaryrefslogtreecommitdiffstats
path: root/bench/MatrixBench.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'bench/MatrixBench.cpp')
-rw-r--r--bench/MatrixBench.cpp98
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); }