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