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