ScalarBench.cpp revision 80f709a0d7f2f1d0d35a292c0c3189d3a50b4993
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 8f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com#include "SkBenchmark.h" 925583a381252921f2e9d0dc4a30c3834ef677530tomhudson@google.com#include "SkFloatBits.h" 10f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com#include "SkRandom.h" 1163c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.com#include "SkRect.h" 12f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com#include "SkString.h" 13f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com 14f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.comclass ScalarBench : public SkBenchmark { 15f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com SkString fName; 16f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.compublic: 17410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com ScalarBench(const char name[]) { 18f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com fName.printf("scalar_%s", name); 19644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org } 20644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org 21644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org virtual bool isSuitableFor(Backend backend) SK_OVERRIDE { 22644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org return backend == kNonRendering_Backend; 23f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com } 24f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com 25f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com virtual void performTest() = 0; 26f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com 27f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.comprotected: 28f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com virtual int mulLoopCount() const { return 1; } 29f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com 30357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.com virtual const char* onGetName() SK_OVERRIDE { 31f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com return fName.c_str(); 32f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com } 33f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com 343361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org virtual void onDraw(const int loops, SkCanvas* canvas) { 353361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; i++) { 36f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com this->performTest(); 37f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com } 38f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com } 39f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com 40f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.comprivate: 41f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com typedef SkBenchmark INHERITED; 42f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com}; 43f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com 44f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com// having unknown values in our arrays can throw off the timing a lot, perhaps 45f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com// handling NaN values is a lot slower. Anyway, this guy is just meant to put 46f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com// reasonable values in our arrays. 47f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.comtemplate <typename T> void init9(T array[9]) { 48e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 49f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com for (int i = 0; i < 9; i++) { 50f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com array[i] = rand.nextSScalar1(); 51f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com } 52f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com} 53f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com 54f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.comclass FloatComparisonBench : public ScalarBench { 55f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.compublic: 56410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com FloatComparisonBench() : INHERITED("compare_float") { 57f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com init9(fArray); 58f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com } 59f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.comprotected: 60f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com virtual int mulLoopCount() const { return 4; } 61f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com virtual void performTest() { 6280f709a0d7f2f1d0d35a292c0c3189d3a50b4993mtklein // xoring into a volatile prevents the compiler from optimizing these checks away. 6380f709a0d7f2f1d0d35a292c0c3189d3a50b4993mtklein volatile bool junk = false; 6480f709a0d7f2f1d0d35a292c0c3189d3a50b4993mtklein junk ^= (fArray[6] != 0.0f || fArray[7] != 0.0f || fArray[8] != 1.0f); 6580f709a0d7f2f1d0d35a292c0c3189d3a50b4993mtklein junk ^= (fArray[2] != 0.0f || fArray[5] != 0.0f); 66f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com } 67f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.comprivate: 68f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com float fArray[9]; 69f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com typedef ScalarBench INHERITED; 70f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com}; 71f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com 72f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.comclass ForcedIntComparisonBench : public ScalarBench { 73f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.compublic: 74410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com ForcedIntComparisonBench() 75410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com : INHERITED("compare_forced_int") { 76f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com init9(fArray); 77f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com } 78f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.comprotected: 79f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com virtual int mulLoopCount() const { return 4; } 80f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com virtual void performTest() { 8180f709a0d7f2f1d0d35a292c0c3189d3a50b4993mtklein // xoring into a volatile prevents the compiler from optimizing these checks away. 8280f709a0d7f2f1d0d35a292c0c3189d3a50b4993mtklein volatile int32_t junk = 0; 8380f709a0d7f2f1d0d35a292c0c3189d3a50b4993mtklein junk ^= (SkScalarAs2sCompliment(fArray[6]) | 8480f709a0d7f2f1d0d35a292c0c3189d3a50b4993mtklein SkScalarAs2sCompliment(fArray[7]) | 8580f709a0d7f2f1d0d35a292c0c3189d3a50b4993mtklein (SkScalarAs2sCompliment(fArray[8]) - kPersp1Int)); 8680f709a0d7f2f1d0d35a292c0c3189d3a50b4993mtklein junk ^= (SkScalarAs2sCompliment(fArray[2]) | 8780f709a0d7f2f1d0d35a292c0c3189d3a50b4993mtklein SkScalarAs2sCompliment(fArray[5])); 88f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com } 89f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.comprivate: 90f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com static const int32_t kPersp1Int = 0x3f800000; 9125583a381252921f2e9d0dc4a30c3834ef677530tomhudson@google.com SkScalar fArray[9]; 92f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com typedef ScalarBench INHERITED; 93f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com}; 94f910b36e45b3211ac46ad964b221d6251dda2cf7tomhudson@google.com 95357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.comclass IsFiniteScalarBench : public ScalarBench { 96357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.compublic: 97410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com IsFiniteScalarBench() : INHERITED("isfinite") { 98e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 99357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.com for (size_t i = 0; i < ARRAY_N; ++i) { 100357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.com fArray[i] = rand.nextSScalar1(); 101357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.com } 102357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.com } 103357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.comprotected: 104357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.com virtual int mulLoopCount() const { return 1; } 105357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.com virtual void performTest() SK_OVERRIDE { 106357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.com int sum = 0; 107357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.com for (size_t i = 0; i < ARRAY_N; ++i) { 108357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.com // We pass -fArray[i], so the compiler can't cheat and treat the 109357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.com // value as an int (even though we tell it that it is a float) 110357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.com sum += SkScalarIsFinite(-fArray[i]); 111357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.com } 112357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.com // we do this so the compiler won't optimize our loop away... 113357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.com this->doSomething(fArray, sum); 114357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.com } 115357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.com 116357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.com virtual void doSomething(SkScalar array[], int sum) {} 117357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.comprivate: 118357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.com enum { 119357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.com ARRAY_N = 64 120357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.com }; 121357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.com SkScalar fArray[ARRAY_N]; 122357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.com 123357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.com typedef ScalarBench INHERITED; 124357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.com}; 125357818cb76d9f8a6a74d1b2f9c91fb4c0b7a288creed@google.com 12663c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.com/////////////////////////////////////////////////////////////////////////////// 12763c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.com 12863c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.comclass RectBoundsBench : public SkBenchmark { 12963c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.com enum { 13063c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.com PTS = 100, 13163c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.com }; 13263c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.com SkPoint fPts[PTS]; 13363c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.com 13463c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.compublic: 135410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com RectBoundsBench() { 136e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 13763c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.com for (int i = 0; i < PTS; ++i) { 13863c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.com fPts[i].fX = rand.nextSScalar1(); 13963c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.com fPts[i].fY = rand.nextSScalar1(); 14063c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.com } 141644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org } 142644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org 143644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org virtual bool isSuitableFor(Backend backend) SK_OVERRIDE { 144644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org return backend == kNonRendering_Backend; 14563c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.com } 14663c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.com 14763c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.comprotected: 14863c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.com virtual const char* onGetName() SK_OVERRIDE { 14963c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.com return "rect_bounds"; 15063c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.com } 15163c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.com 1523361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { 15363c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.com SkRect r; 1543361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 15563c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.com r.set(fPts, PTS); 15663c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.com } 15763c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.com } 15863c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.com 15963c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.comprivate: 16063c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.com typedef SkBenchmark INHERITED; 16163c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.com}; 16263c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.com 16363c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.com/////////////////////////////////////////////////////////////////////////////// 16463c57613b8b53d142be6d44aed4ef9e3b9d7cf11reed@google.com 165410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new FloatComparisonBench(); ) 166410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ForcedIntComparisonBench(); ) 167410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new RectBoundsBench(); ) 168410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new IsFiniteScalarBench(); ) 169