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