1554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com/*
2554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com * Copyright 2012 Google Inc.
3554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com *
4554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com * Use of this source code is governed by a BSD-style license that can be
5554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com * found in the LICENSE file.
6554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com */
7f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include <memory>
8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
962a69c26b3a34c259918d6c97b4dea76b6285b67herb#include "SkAtomics.h"
10a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com#include "SkRefCnt.h"
11a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com#include "SkWeakRefCnt.h"
12554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com
13554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.comenum {
14c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com    M = 2
15554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com};
16554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com
1700a8fae0cee239181c9e4fc7775b01b661c72f5ebsalomonclass AtomicInc32 : public Benchmark {
1800a8fae0cee239181c9e4fc7775b01b661c72f5ebsalomonpublic:
1900a8fae0cee239181c9e4fc7775b01b661c72f5ebsalomon    AtomicInc32() : fX(0) {}
2000a8fae0cee239181c9e4fc7775b01b661c72f5ebsalomon
2136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool isSuitableFor(Backend backend) override {
2200a8fae0cee239181c9e4fc7775b01b661c72f5ebsalomon        return backend == kNonRendering_Backend;
2300a8fae0cee239181c9e4fc7775b01b661c72f5ebsalomon    }
2400a8fae0cee239181c9e4fc7775b01b661c72f5ebsalomon
2500a8fae0cee239181c9e4fc7775b01b661c72f5ebsalomonprotected:
26f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein    const char* onGetName() override {
2700a8fae0cee239181c9e4fc7775b01b661c72f5ebsalomon        return "atomic_inc_32";
2800a8fae0cee239181c9e4fc7775b01b661c72f5ebsalomon    }
2900a8fae0cee239181c9e4fc7775b01b661c72f5ebsalomon
30a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein    void onDraw(int loops, SkCanvas*) override {
3100a8fae0cee239181c9e4fc7775b01b661c72f5ebsalomon        for (int i = 0; i < loops; ++i) {
3200a8fae0cee239181c9e4fc7775b01b661c72f5ebsalomon            sk_atomic_inc(&fX);
3300a8fae0cee239181c9e4fc7775b01b661c72f5ebsalomon        }
3400a8fae0cee239181c9e4fc7775b01b661c72f5ebsalomon    }
3500a8fae0cee239181c9e4fc7775b01b661c72f5ebsalomon
3600a8fae0cee239181c9e4fc7775b01b661c72f5ebsalomonprivate:
3700a8fae0cee239181c9e4fc7775b01b661c72f5ebsalomon    int32_t fX;
3800a8fae0cee239181c9e4fc7775b01b661c72f5ebsalomon    typedef Benchmark INHERITED;
3900a8fae0cee239181c9e4fc7775b01b661c72f5ebsalomon};
4000a8fae0cee239181c9e4fc7775b01b661c72f5ebsalomon
41f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass RefCntBench_Stack : public Benchmark {
42554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.compublic:
4336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool isSuitableFor(Backend backend) override {
44644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org        return backend == kNonRendering_Backend;
45554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com    }
46644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org
47554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.comprotected:
48f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein    const char* onGetName() override {
49554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com        return "ref_cnt_stack";
50554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com    }
51554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com
52a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein    void onDraw(int loops, SkCanvas*) override {
533361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
54554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com            SkRefCnt ref;
55554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com            for (int j = 0; j < M; ++j) {
56554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com                ref.ref();
57554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com                ref.unref();
58554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com            }
59554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com        }
60554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com    }
61554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com
62554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.comprivate:
63f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
64554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com};
65554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com
66554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.comclass PlacedRefCnt : public SkRefCnt {
67554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.compublic:
68554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com    PlacedRefCnt() : SkRefCnt() { }
6977472f06f88b85e85fb690584c85d0a42e74b685sugoi@google.com    void operator delete(void*) { }
7015e9d3e66e161ce23df30bc13f8a0c87d196b463robertphillips@google.com
7115e9d3e66e161ce23df30bc13f8a0c87d196b463robertphillips@google.comprivate:
7215e9d3e66e161ce23df30bc13f8a0c87d196b463robertphillips@google.com    typedef SkRefCnt INHERITED;
73554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com};
74554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com
75f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass RefCntBench_Heap : public Benchmark {
76554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.compublic:
7736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool isSuitableFor(Backend backend) override {
78644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org        return backend == kNonRendering_Backend;
79554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com    }
80644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org
81554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.comprotected:
82f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein    const char* onGetName() override {
83554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com        return "ref_cnt_heap";
84554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com    }
85554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com
86a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein    void onDraw(int loops, SkCanvas*) override {
87554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com        char memory[sizeof(PlacedRefCnt)];
883361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
89554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com            PlacedRefCnt* ref = new (memory) PlacedRefCnt();
90554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com            for (int j = 0; j < M; ++j) {
91554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com                ref->ref();
92554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com                ref->unref();
93554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com            }
94554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com            ref->unref();
95554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com        }
96554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com    }
97554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com
98554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.comprivate:
99f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
100554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com};
101554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com
102f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass RefCntBench_New : public Benchmark {
103a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.compublic:
10436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool isSuitableFor(Backend backend) override {
105644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org        return backend == kNonRendering_Backend;
106a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com    }
107644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org
108a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.comprotected:
109f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein    const char* onGetName() override {
110a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com        return "ref_cnt_new";
111a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com    }
112a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com
113a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein    void onDraw(int loops, SkCanvas*) override {
1143361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
115a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com            SkRefCnt* ref = new SkRefCnt();
116a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com            for (int j = 0; j < M; ++j) {
117a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com                ref->ref();
118a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com                ref->unref();
119a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com            }
120a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com            ref->unref();
121a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com        }
122a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com    }
123a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com
124a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.comprivate:
125f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
126a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com};
127a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com
128a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com///////////////////////////////////////////////////////////////////////////////
129a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com
130f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass WeakRefCntBench_Stack : public Benchmark {
131a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.compublic:
13236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool isSuitableFor(Backend backend) override {
133644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org        return backend == kNonRendering_Backend;
134a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com    }
135644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org
136a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.comprotected:
137f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein    const char* onGetName() override {
138a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com        return "ref_cnt_stack_weak";
139a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com    }
140a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com
141a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein    void onDraw(int loops, SkCanvas*) override {
1423361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
143a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com            SkWeakRefCnt ref;
144a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com            for (int j = 0; j < M; ++j) {
145a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com                ref.ref();
146a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com                ref.unref();
147a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com            }
148a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com        }
149a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com    }
150a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com
151a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.comprivate:
152f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
153a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com};
154a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com
155a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.comclass PlacedWeakRefCnt : public SkWeakRefCnt {
156a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.compublic:
157a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com    PlacedWeakRefCnt() : SkWeakRefCnt() { }
15877472f06f88b85e85fb690584c85d0a42e74b685sugoi@google.com    void operator delete(void*) { }
159a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com};
160a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com
161f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass WeakRefCntBench_Heap : public Benchmark {
162a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.compublic:
16336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool isSuitableFor(Backend backend) override {
164644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org        return backend == kNonRendering_Backend;
165a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com    }
166644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org
167a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.comprotected:
16836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
169a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com        return "ref_cnt_heap_weak";
170a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com    }
171a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com
172a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein    void onDraw(int loops, SkCanvas*) override {
173a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com        char memory[sizeof(PlacedWeakRefCnt)];
1743361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
175a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com            PlacedWeakRefCnt* ref = new (memory) PlacedWeakRefCnt();
176a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com            for (int j = 0; j < M; ++j) {
177a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com                ref->ref();
178a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com                ref->unref();
179a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com            }
180a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com            ref->unref();
181a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com        }
182a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com    }
183a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com
184a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.comprivate:
185f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
186a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com};
187a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com
188f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass WeakRefCntBench_New : public Benchmark {
189a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.compublic:
19036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool isSuitableFor(Backend backend) override {
191644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org        return backend == kNonRendering_Backend;
192a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com    }
193644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org
194a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.comprotected:
19536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
196a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com        return "ref_cnt_new_weak";
197a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com    }
198a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com
199a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein    void onDraw(int loops, SkCanvas*) override {
2003361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
201a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com            SkWeakRefCnt* ref = new SkWeakRefCnt();
202a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com            for (int j = 0; j < M; ++j) {
203a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com                ref->ref();
204a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com                ref->unref();
205a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com            }
206a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com            ref->unref();
207a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com        }
208a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com    }
209a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com
210a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.comprivate:
211f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
212a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com};
213a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com
214554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com///////////////////////////////////////////////////////////////////////////////
215554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com
21600a8fae0cee239181c9e4fc7775b01b661c72f5ebsalomonDEF_BENCH( return new AtomicInc32(); )
21700a8fae0cee239181c9e4fc7775b01b661c72f5ebsalomon
218410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new RefCntBench_Stack(); )
219410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new RefCntBench_Heap(); )
220410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new RefCntBench_New(); )
221a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com
222410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new WeakRefCntBench_Stack(); )
223410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new WeakRefCntBench_Heap(); )
224410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new WeakRefCntBench_New(); )
225