Matrix44Bench.cpp 7.5 KB

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