RefCntBench.cpp revision 62a69c26b3a34c259918d6c97b4dea76b6285b67
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 <memory> 8#include "Benchmark.h" 9#include "SkAtomics.h" 10#include "SkRefCnt.h" 11#include "SkWeakRefCnt.h" 12 13enum { 14 M = 2 15}; 16 17class AtomicInc32 : public Benchmark { 18public: 19 AtomicInc32() : fX(0) {} 20 21 bool isSuitableFor(Backend backend) override { 22 return backend == kNonRendering_Backend; 23 } 24 25protected: 26 const char* onGetName() override { 27 return "atomic_inc_32"; 28 } 29 30 void onDraw(const int loops, SkCanvas*) override { 31 for (int i = 0; i < loops; ++i) { 32 sk_atomic_inc(&fX); 33 } 34 } 35 36private: 37 int32_t fX; 38 typedef Benchmark INHERITED; 39}; 40 41class AtomicInc64 : public Benchmark { 42public: 43 AtomicInc64() : fX(0) {} 44 45 bool isSuitableFor(Backend backend) override { 46 return backend == kNonRendering_Backend; 47 } 48 49protected: 50 const char* onGetName() override { 51 return "atomic_inc_64"; 52 } 53 54 void onDraw(const int loops, SkCanvas*) override { 55 for (int i = 0; i < loops; ++i) { 56 sk_atomic_inc(&fX); 57 } 58 } 59 60private: 61 int64_t fX; 62 typedef Benchmark INHERITED; 63}; 64 65class RefCntBench_Stack : public Benchmark { 66public: 67 bool isSuitableFor(Backend backend) override { 68 return backend == kNonRendering_Backend; 69 } 70 71protected: 72 const char* onGetName() override { 73 return "ref_cnt_stack"; 74 } 75 76 void onDraw(const int loops, SkCanvas*) override { 77 for (int i = 0; i < loops; ++i) { 78 SkRefCnt ref; 79 for (int j = 0; j < M; ++j) { 80 ref.ref(); 81 ref.unref(); 82 } 83 } 84 } 85 86private: 87 typedef Benchmark INHERITED; 88}; 89 90class PlacedRefCnt : public SkRefCnt { 91public: 92 PlacedRefCnt() : SkRefCnt() { } 93 void operator delete(void*) { } 94 95private: 96 typedef SkRefCnt INHERITED; 97}; 98 99class RefCntBench_Heap : public Benchmark { 100public: 101 bool isSuitableFor(Backend backend) override { 102 return backend == kNonRendering_Backend; 103 } 104 105protected: 106 const char* onGetName() override { 107 return "ref_cnt_heap"; 108 } 109 110 void onDraw(const int loops, SkCanvas*) override { 111 char memory[sizeof(PlacedRefCnt)]; 112 for (int i = 0; i < loops; ++i) { 113 PlacedRefCnt* ref = new (memory) PlacedRefCnt(); 114 for (int j = 0; j < M; ++j) { 115 ref->ref(); 116 ref->unref(); 117 } 118 ref->unref(); 119 } 120 } 121 122private: 123 typedef Benchmark INHERITED; 124}; 125 126class RefCntBench_New : public Benchmark { 127public: 128 bool isSuitableFor(Backend backend) override { 129 return backend == kNonRendering_Backend; 130 } 131 132protected: 133 const char* onGetName() override { 134 return "ref_cnt_new"; 135 } 136 137 void onDraw(const int loops, SkCanvas*) override { 138 for (int i = 0; i < loops; ++i) { 139 SkRefCnt* ref = new SkRefCnt(); 140 for (int j = 0; j < M; ++j) { 141 ref->ref(); 142 ref->unref(); 143 } 144 ref->unref(); 145 } 146 } 147 148private: 149 typedef Benchmark INHERITED; 150}; 151 152/////////////////////////////////////////////////////////////////////////////// 153 154class WeakRefCntBench_Stack : public Benchmark { 155public: 156 bool isSuitableFor(Backend backend) override { 157 return backend == kNonRendering_Backend; 158 } 159 160protected: 161 const char* onGetName() override { 162 return "ref_cnt_stack_weak"; 163 } 164 165 void onDraw(const int loops, SkCanvas*) override { 166 for (int i = 0; i < loops; ++i) { 167 SkWeakRefCnt ref; 168 for (int j = 0; j < M; ++j) { 169 ref.ref(); 170 ref.unref(); 171 } 172 } 173 } 174 175private: 176 typedef Benchmark INHERITED; 177}; 178 179class PlacedWeakRefCnt : public SkWeakRefCnt { 180public: 181 PlacedWeakRefCnt() : SkWeakRefCnt() { } 182 void operator delete(void*) { } 183}; 184 185class WeakRefCntBench_Heap : public Benchmark { 186public: 187 bool isSuitableFor(Backend backend) override { 188 return backend == kNonRendering_Backend; 189 } 190 191protected: 192 const char* onGetName() override { 193 return "ref_cnt_heap_weak"; 194 } 195 196 void onDraw(const int loops, SkCanvas*) override { 197 char memory[sizeof(PlacedWeakRefCnt)]; 198 for (int i = 0; i < loops; ++i) { 199 PlacedWeakRefCnt* ref = new (memory) PlacedWeakRefCnt(); 200 for (int j = 0; j < M; ++j) { 201 ref->ref(); 202 ref->unref(); 203 } 204 ref->unref(); 205 } 206 } 207 208private: 209 typedef Benchmark INHERITED; 210}; 211 212class WeakRefCntBench_New : public Benchmark { 213public: 214 bool isSuitableFor(Backend backend) override { 215 return backend == kNonRendering_Backend; 216 } 217 218protected: 219 const char* onGetName() override { 220 return "ref_cnt_new_weak"; 221 } 222 223 void onDraw(const int loops, SkCanvas*) override { 224 for (int i = 0; i < loops; ++i) { 225 SkWeakRefCnt* ref = new SkWeakRefCnt(); 226 for (int j = 0; j < M; ++j) { 227 ref->ref(); 228 ref->unref(); 229 } 230 ref->unref(); 231 } 232 } 233 234private: 235 typedef Benchmark INHERITED; 236}; 237 238/////////////////////////////////////////////////////////////////////////////// 239 240DEF_BENCH( return new AtomicInc32(); ) 241DEF_BENCH( return new AtomicInc64(); ) 242 243DEF_BENCH( return new RefCntBench_Stack(); ) 244DEF_BENCH( return new RefCntBench_Heap(); ) 245DEF_BENCH( return new RefCntBench_New(); ) 246 247DEF_BENCH( return new WeakRefCntBench_Stack(); ) 248DEF_BENCH( return new WeakRefCntBench_Heap(); ) 249DEF_BENCH( return new WeakRefCntBench_New(); ) 250