Home | History | Annotate | Download | only in bench
      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 "Benchmark.h"
      9 #include "SkMatrix44.h"
     10 #include "SkRandom.h"
     11 #include "SkString.h"
     12 
     13 class Matrix44Bench : public Benchmark {
     14     SkString    fName;
     15 public:
     16     Matrix44Bench(const char name[]) {
     17         fName.printf("matrix44_%s", name);
     18     }
     19 
     20     bool isSuitableFor(Backend backend) override {
     21         return backend == kNonRendering_Backend;
     22     }
     23 
     24     virtual void performTest() = 0;
     25 
     26 protected:
     27     virtual int mulLoopCount() const { return 1; }
     28 
     29     const char* onGetName() override {
     30         return fName.c_str();
     31     }
     32 
     33     void onDraw(int loops, SkCanvas*) override {
     34         for (int i = 0; i < loops; i++) {
     35             this->performTest();
     36         }
     37     }
     38 
     39 private:
     40     typedef Benchmark INHERITED;
     41 };
     42 
     43 class EqualsMatrix44Bench : public Matrix44Bench {
     44 public:
     45     EqualsMatrix44Bench()
     46         : INHERITED("equals")
     47         , fM0(SkMatrix44::kIdentity_Constructor)
     48         , fM1(SkMatrix44::kIdentity_Constructor)
     49         , fM2(SkMatrix44::kIdentity_Constructor)
     50     {
     51         fM1.set(0, 0, 0);
     52         fM2.set(3, 3, 0);
     53     }
     54 protected:
     55     void performTest() override {
     56         for (int i = 0; i < 10; ++i) {
     57             (void) (fM0 == fM1);
     58             (void) (fM1 == fM2);
     59             (void) (fM2 == fM0);
     60         }
     61     }
     62 private:
     63     SkMatrix44 fM0, fM1, fM2;
     64     typedef Matrix44Bench INHERITED;
     65 };
     66 
     67 class SetIdentityMatrix44Bench : public Matrix44Bench {
     68 public:
     69     SetIdentityMatrix44Bench()
     70         : INHERITED("setidentity")
     71         , mat(SkMatrix44::kIdentity_Constructor)
     72     {
     73         double rowMajor[16] =
     74                 { 1, 2, 3, 4,
     75                   5, 6, 7, 8,
     76                   9, 10, 11, 12,
     77                   13, 14, 15, 16};
     78         mat.setRowMajord(rowMajor);
     79     }
     80 protected:
     81     void performTest() override {
     82         for (int i = 0; i < 10; ++i) {
     83             mat.setIdentity();
     84         }
     85     }
     86 private:
     87     SkMatrix44 mat;
     88     typedef Matrix44Bench INHERITED;
     89 };
     90 
     91 class PreScaleMatrix44Bench : public Matrix44Bench {
     92 public:
     93     PreScaleMatrix44Bench()
     94         : INHERITED("prescale")
     95         , fM0(SkMatrix44::kUninitialized_Constructor)
     96     {
     97         fX = fY = fZ = SkDoubleToMScalar(1.5);
     98     }
     99 protected:
    100     void performTest() override {
    101         fM0.reset();
    102         for (int i = 0; i < 10; ++i) {
    103             fM0.preScale(fX, fY, fZ);
    104         }
    105     }
    106 private:
    107     SkMatrix44 fM0;
    108     SkMScalar  fX, fY, fZ;
    109     typedef Matrix44Bench INHERITED;
    110 };
    111 
    112 class InvertMatrix44Bench : public Matrix44Bench {
    113 public:
    114     InvertMatrix44Bench()
    115         : INHERITED("invert")
    116         , fM0(SkMatrix44::kUninitialized_Constructor)
    117         , fM1(SkMatrix44::kUninitialized_Constructor)
    118     {
    119         fM0.setDouble(0, 0, -1.1);
    120         fM0.setDouble(0, 1, 2.1);
    121         fM0.setDouble(0, 2, -3.1);
    122         fM0.setDouble(0, 3, 4.1);
    123         fM0.setDouble(1, 0, 5.1);
    124         fM0.setDouble(1, 1, -6.1);
    125         fM0.setDouble(1, 2, 7.1);
    126         fM0.setDouble(1, 3, 8.1);
    127         fM0.setDouble(2, 0, -9.1);
    128         fM0.setDouble(2, 1, 10.1);
    129         fM0.setDouble(2, 2, 11.1);
    130         fM0.setDouble(2, 3, -12.1);
    131         fM0.setDouble(3, 0, -13.1);
    132         fM0.setDouble(3, 1, 14.1);
    133         fM0.setDouble(3, 2, -15.1);
    134         fM0.setDouble(3, 3, 16.1);
    135     }
    136 protected:
    137     void performTest() override {
    138         for (int i = 0; i < 10; ++i) {
    139             fM0.invert(&fM1);
    140         }
    141     }
    142 private:
    143     SkMatrix44 fM0, fM1;
    144     typedef Matrix44Bench INHERITED;
    145 };
    146 
    147 class InvertAffineMatrix44Bench : public Matrix44Bench {
    148 public:
    149     InvertAffineMatrix44Bench()
    150         : INHERITED("invertaffine")
    151         , fM0(SkMatrix44::kIdentity_Constructor)
    152         , fM1(SkMatrix44::kUninitialized_Constructor)
    153     {
    154         fM0.setDouble(0, 0, -1.1);
    155         fM0.setDouble(0, 1, 2.1);
    156         fM0.setDouble(0, 2, -3.1);
    157         fM0.setDouble(0, 3, 4.1);
    158         fM0.setDouble(1, 0, 5.1);
    159         fM0.setDouble(1, 1, -6.1);
    160         fM0.setDouble(1, 2, 7.1);
    161         fM0.setDouble(1, 3, 8.1);
    162         fM0.setDouble(2, 0, -9.1);
    163         fM0.setDouble(2, 1, 10.1);
    164         fM0.setDouble(2, 2, 11.1);
    165         fM0.setDouble(2, 3, -12.1);
    166         // bottom row (perspective component) remains (0, 0, 0, 1).
    167     }
    168 protected:
    169     void performTest() override {
    170         for (int i = 0; i < 10; ++i) {
    171             fM0.invert(&fM1);
    172         }
    173     }
    174 private:
    175     SkMatrix44 fM0, fM1;
    176     typedef Matrix44Bench INHERITED;
    177 };
    178 
    179 class InvertScaleTranslateMatrix44Bench : public Matrix44Bench {
    180 public:
    181     InvertScaleTranslateMatrix44Bench()
    182         : INHERITED("invertscaletranslate")
    183         , fM0(SkMatrix44::kIdentity_Constructor)
    184         , fM1(SkMatrix44::kUninitialized_Constructor)
    185     {
    186         fM0.setDouble(0, 0, -1.1);
    187         fM0.setDouble(0, 3, 4.1);
    188 
    189         fM0.setDouble(1, 1, -6.1);
    190         fM0.setDouble(1, 3, 8.1);
    191 
    192         fM0.setDouble(2, 2, 11.1);
    193         fM0.setDouble(2, 3, -12.1);
    194     }
    195 protected:
    196     void performTest() override {
    197         for (int i = 0; i < 10; ++i) {
    198             fM0.invert(&fM1);
    199         }
    200     }
    201 private:
    202     SkMatrix44 fM0, fM1;
    203     typedef Matrix44Bench INHERITED;
    204 };
    205 
    206 class InvertTranslateMatrix44Bench : public Matrix44Bench {
    207 public:
    208     InvertTranslateMatrix44Bench()
    209         : INHERITED("inverttranslate")
    210         , fM0(SkMatrix44::kIdentity_Constructor)
    211         , fM1(SkMatrix44::kUninitialized_Constructor)
    212     {
    213         fM0.setDouble(0, 3, 4.1);
    214         fM0.setDouble(1, 3, 8.1);
    215         fM0.setDouble(2, 3, -12.1);
    216     }
    217 protected:
    218     void performTest() override {
    219         for (int i = 0; i < 10; ++i) {
    220             fM0.invert(&fM1);
    221         }
    222     }
    223 private:
    224     SkMatrix44 fM0, fM1;
    225     typedef Matrix44Bench INHERITED;
    226 };
    227 
    228 class PostScaleMatrix44Bench : public Matrix44Bench {
    229 public:
    230     PostScaleMatrix44Bench()
    231         : INHERITED("postscale")
    232         , fM0(SkMatrix44::kUninitialized_Constructor)
    233     {
    234         fX = fY = fZ = SkDoubleToMScalar(1.5);
    235     }
    236 protected:
    237     void performTest() override {
    238         fM0.reset();
    239         for (int i = 0; i < 10; ++i) {
    240             fM0.postScale(fX, fY, fZ);
    241         }
    242     }
    243 private:
    244     SkMatrix44 fM0;
    245     SkMScalar  fX, fY, fZ;
    246     typedef Matrix44Bench INHERITED;
    247 };
    248 
    249 class SetConcatMatrix44Bench : public Matrix44Bench {
    250 public:
    251     // SkMatrix44::setConcat() has a fast path for matrices that are at most scale+translate.
    252     SetConcatMatrix44Bench(bool fastPath)
    253         : INHERITED(fastPath ? "setconcat_fast" : "setconcat_general")
    254         , fM0(SkMatrix44::kUninitialized_Constructor)
    255         , fM1(SkMatrix44::kUninitialized_Constructor)
    256         , fM2(SkMatrix44::kUninitialized_Constructor)
    257 {
    258         if (fastPath) {
    259             const SkMScalar v = SkDoubleToMScalar(1.5);
    260             fM1.setScale(v,v,v);
    261             fM2.setTranslate(v,v,v);
    262         } else {
    263             SkRandom rand;
    264             for (int x = 0; x < 4; x++) {
    265             for (int y = 0; y < 4; y++) {
    266                 fM1.setFloat(x,y, rand.nextF());
    267                 fM2.setFloat(x,y, rand.nextF());
    268             }}
    269         }
    270     }
    271 protected:
    272     void performTest() override {
    273         fM0.reset();    // just to normalize this test with prescale/postscale
    274         for (int i = 0; i < 10000; ++i) {
    275             fM0.setConcat(fM1, fM2);
    276         }
    277     }
    278 private:
    279     SkMatrix44 fM0, fM1, fM2;
    280     typedef Matrix44Bench INHERITED;
    281 };
    282 
    283 class GetTypeMatrix44Bench : public Matrix44Bench {
    284 public:
    285     GetTypeMatrix44Bench()
    286         : INHERITED("gettype")
    287         , fMatrix(SkMatrix44::kIdentity_Constructor)
    288     {}
    289 protected:
    290     // Putting random generation of the matrix inside performTest()
    291     // would help us avoid anomalous runs, but takes up 25% or
    292     // more of the function time.
    293     void performTest() override {
    294         for (int i = 0; i < 20; ++i) {
    295             fMatrix.set(1, 2, 1);   // to invalidate the type-cache
    296             fMatrix.getType();
    297         }
    298     }
    299 private:
    300     SkMatrix44 fMatrix;
    301     typedef Matrix44Bench INHERITED;
    302 };
    303 
    304 DEF_BENCH( return new SetIdentityMatrix44Bench(); )
    305 DEF_BENCH( return new EqualsMatrix44Bench(); )
    306 DEF_BENCH( return new PreScaleMatrix44Bench(); )
    307 DEF_BENCH( return new PostScaleMatrix44Bench(); )
    308 DEF_BENCH( return new InvertMatrix44Bench(); )
    309 DEF_BENCH( return new InvertAffineMatrix44Bench(); )
    310 DEF_BENCH( return new InvertScaleTranslateMatrix44Bench(); )
    311 DEF_BENCH( return new InvertTranslateMatrix44Bench(); )
    312 DEF_BENCH( return new SetConcatMatrix44Bench(true); )
    313 DEF_BENCH( return new SetConcatMatrix44Bench(false); )
    314 DEF_BENCH( return new GetTypeMatrix44Bench(); )
    315