Matrix44Bench.cpp revision 410e6e80f00a6c660675c80904807a041c7b7d2a
1/* 2 * Copyright 2012 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8#include "SkBenchmark.h" 9#include "SkMatrix44.h" 10#include "SkRandom.h" 11#include "SkString.h" 12 13class Matrix44Bench : public SkBenchmark { 14 SkString fName; 15public: 16 Matrix44Bench(const char name[]) { 17 fName.printf("matrix44_%s", name); 18 fIsRendering = false; 19 } 20 21 virtual void performTest() = 0; 22 23protected: 24 virtual int mulLoopCount() const { return 1; } 25 26 virtual const char* onGetName() { 27 return fName.c_str(); 28 } 29 30 virtual void onDraw(SkCanvas*) { 31 for (int i = 0; i < this->getLoops(); i++) { 32 this->performTest(); 33 } 34 } 35 36private: 37 typedef SkBenchmark INHERITED; 38}; 39 40class EqualsMatrix44Bench : public Matrix44Bench { 41public: 42 EqualsMatrix44Bench() : INHERITED("equals") { 43 fM1.set(0, 0, 0); 44 fM2.set(3, 3, 0); 45 } 46protected: 47 virtual void performTest() { 48 for (int i = 0; i < 10; ++i) { 49 (void) (fM0 == fM1); 50 (void) (fM1 == fM2); 51 (void) (fM2 == fM0); 52 } 53 } 54private: 55 SkMatrix44 fM0, fM1, fM2; 56 typedef Matrix44Bench INHERITED; 57}; 58 59class SetIdentityMatrix44Bench : public Matrix44Bench { 60public: 61 SetIdentityMatrix44Bench() : INHERITED("setidentity") { 62 double rowMajor[16] = 63 { 1, 2, 3, 4, 64 5, 6, 7, 8, 65 9, 10, 11, 12, 66 13, 14, 15, 16}; 67 mat.setRowMajord(rowMajor); 68 } 69protected: 70 virtual void performTest() { 71 for (int i = 0; i < 10; ++i) { 72 mat.setIdentity(); 73 } 74 } 75private: 76 SkMatrix44 mat; 77 typedef Matrix44Bench INHERITED; 78}; 79 80class PreScaleMatrix44Bench : public Matrix44Bench { 81public: 82 PreScaleMatrix44Bench() : INHERITED("prescale") { 83 fX = fY = fZ = SkDoubleToMScalar(1.5); 84 } 85protected: 86 virtual void performTest() { 87 fM0.reset(); 88 for (int i = 0; i < 10; ++i) { 89 fM0.preScale(fX, fY, fZ); 90 } 91 } 92private: 93 SkMatrix44 fM0; 94 SkMScalar fX, fY, fZ; 95 typedef Matrix44Bench INHERITED; 96}; 97 98class InvertMatrix44Bench : public Matrix44Bench { 99public: 100 InvertMatrix44Bench() : INHERITED("invert") { 101 fM0.set(0, 0, -1.1); 102 fM0.set(0, 1, 2.1); 103 fM0.set(0, 2, -3.1); 104 fM0.set(0, 3, 4.1); 105 fM0.set(1, 0, 5.1); 106 fM0.set(1, 1, -6.1); 107 fM0.set(1, 2, 7.1); 108 fM0.set(1, 3, 8.1); 109 fM0.set(2, 0, -9.1); 110 fM0.set(2, 1, 10.1); 111 fM0.set(2, 2, 11.1); 112 fM0.set(2, 3, -12.1); 113 fM0.set(3, 0, -13.1); 114 fM0.set(3, 1, 14.1); 115 fM0.set(3, 2, -15.1); 116 fM0.set(3, 3, 16.1); 117 } 118protected: 119 virtual void performTest() { 120 for (int i = 0; i < 10; ++i) { 121 fM0.invert(&fM1); 122 } 123 } 124private: 125 SkMatrix44 fM0, fM1; 126 typedef Matrix44Bench INHERITED; 127}; 128 129class InvertAffineMatrix44Bench : public Matrix44Bench { 130public: 131 InvertAffineMatrix44Bench() : INHERITED("invertaffine") { 132 fM0.set(0, 0, -1.1); 133 fM0.set(0, 1, 2.1); 134 fM0.set(0, 2, -3.1); 135 fM0.set(0, 3, 4.1); 136 fM0.set(1, 0, 5.1); 137 fM0.set(1, 1, -6.1); 138 fM0.set(1, 2, 7.1); 139 fM0.set(1, 3, 8.1); 140 fM0.set(2, 0, -9.1); 141 fM0.set(2, 1, 10.1); 142 fM0.set(2, 2, 11.1); 143 fM0.set(2, 3, -12.1); 144 // bottom row (perspective component) remains (0, 0, 0, 1). 145 } 146protected: 147 virtual void performTest() { 148 for (int i = 0; i < 10; ++i) { 149 fM0.invert(&fM1); 150 } 151 } 152private: 153 SkMatrix44 fM0, fM1; 154 typedef Matrix44Bench INHERITED; 155}; 156 157class InvertScaleTranslateMatrix44Bench : public Matrix44Bench { 158public: 159 InvertScaleTranslateMatrix44Bench() : INHERITED("invertscaletranslate") { 160 fM0.set(0, 0, -1.1); 161 fM0.set(0, 3, 4.1); 162 163 fM0.set(1, 1, -6.1); 164 fM0.set(1, 3, 8.1); 165 166 fM0.set(2, 2, 11.1); 167 fM0.set(2, 3, -12.1); 168 } 169protected: 170 virtual void performTest() { 171 for (int i = 0; i < 10; ++i) { 172 fM0.invert(&fM1); 173 } 174 } 175private: 176 SkMatrix44 fM0, fM1; 177 typedef Matrix44Bench INHERITED; 178}; 179 180class InvertTranslateMatrix44Bench : public Matrix44Bench { 181public: 182 InvertTranslateMatrix44Bench() : INHERITED("inverttranslate") { 183 fM0.set(0, 3, 4.1); 184 fM0.set(1, 3, 8.1); 185 fM0.set(2, 3, -12.1); 186 } 187protected: 188 virtual void performTest() { 189 for (int i = 0; i < 10; ++i) { 190 fM0.invert(&fM1); 191 } 192 } 193private: 194 SkMatrix44 fM0, fM1; 195 typedef Matrix44Bench INHERITED; 196}; 197 198class PostScaleMatrix44Bench : public Matrix44Bench { 199public: 200 PostScaleMatrix44Bench() : INHERITED("postscale") { 201 fX = fY = fZ = SkDoubleToMScalar(1.5); 202 } 203protected: 204 virtual void performTest() { 205 fM0.reset(); 206 for (int i = 0; i < 10; ++i) { 207 fM0.postScale(fX, fY, fZ); 208 } 209 } 210private: 211 SkMatrix44 fM0; 212 SkMScalar fX, fY, fZ; 213 typedef Matrix44Bench INHERITED; 214}; 215 216class SetConcatMatrix44Bench : public Matrix44Bench { 217public: 218 SetConcatMatrix44Bench() : INHERITED("setconcat") { 219 fX = fY = fZ = SkDoubleToMScalar(1.5); 220 fM1.setScale(fX, fY, fZ); 221 fM2.setTranslate(fX, fY, fZ); 222 } 223protected: 224 virtual void performTest() { 225 fM0.reset(); // just to normalize this test with prescale/postscale 226 for (int i = 0; i < 10; ++i) { 227 fM0.setConcat(fM1, fM2); 228 } 229 } 230private: 231 SkMatrix44 fM0, fM1, fM2; 232 SkMScalar fX, fY, fZ; 233 typedef Matrix44Bench INHERITED; 234}; 235 236class GetTypeMatrix44Bench : public Matrix44Bench { 237public: 238 GetTypeMatrix44Bench() : INHERITED("gettype") {} 239protected: 240 // Putting random generation of the matrix inside performTest() 241 // would help us avoid anomalous runs, but takes up 25% or 242 // more of the function time. 243 virtual void performTest() { 244 for (int i = 0; i < 20; ++i) { 245 fMatrix.set(1, 2, 1); // to invalidate the type-cache 246 fMatrix.getType(); 247 } 248 } 249private: 250 SkMatrix44 fMatrix; 251 typedef Matrix44Bench INHERITED; 252}; 253 254DEF_BENCH( return new SetIdentityMatrix44Bench(); ) 255DEF_BENCH( return new EqualsMatrix44Bench(); ) 256DEF_BENCH( return new PreScaleMatrix44Bench(); ) 257DEF_BENCH( return new PostScaleMatrix44Bench(); ) 258DEF_BENCH( return new InvertMatrix44Bench(); ) 259DEF_BENCH( return new InvertAffineMatrix44Bench(); ) 260DEF_BENCH( return new InvertScaleTranslateMatrix44Bench(); ) 261DEF_BENCH( return new InvertTranslateMatrix44Bench(); ) 262DEF_BENCH( return new SetConcatMatrix44Bench(); ) 263DEF_BENCH( return new GetTypeMatrix44Bench(); ) 264