1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2012 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker #include "bench/Benchmark.h" 8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/SkWeakRefCnt.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 11*c8dee2aaSAndroid Build Coastguard Worker #include <new> 12*c8dee2aaSAndroid Build Coastguard Worker 13*c8dee2aaSAndroid Build Coastguard Worker enum { 14*c8dee2aaSAndroid Build Coastguard Worker M = 2 15*c8dee2aaSAndroid Build Coastguard Worker }; 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker class RefCntBench_Stack : public Benchmark { 18*c8dee2aaSAndroid Build Coastguard Worker public: isSuitableFor(Backend backend)19*c8dee2aaSAndroid Build Coastguard Worker bool isSuitableFor(Backend backend) override { 20*c8dee2aaSAndroid Build Coastguard Worker return backend == Backend::kNonRendering; 21*c8dee2aaSAndroid Build Coastguard Worker } 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Worker protected: onGetName()24*c8dee2aaSAndroid Build Coastguard Worker const char* onGetName() override { 25*c8dee2aaSAndroid Build Coastguard Worker return "ref_cnt_stack"; 26*c8dee2aaSAndroid Build Coastguard Worker } 27*c8dee2aaSAndroid Build Coastguard Worker onDraw(int loops,SkCanvas *)28*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas*) override { 29*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < loops; ++i) { 30*c8dee2aaSAndroid Build Coastguard Worker SkRefCnt ref; 31*c8dee2aaSAndroid Build Coastguard Worker for (int j = 0; j < M; ++j) { 32*c8dee2aaSAndroid Build Coastguard Worker ref.ref(); 33*c8dee2aaSAndroid Build Coastguard Worker ref.unref(); 34*c8dee2aaSAndroid Build Coastguard Worker } 35*c8dee2aaSAndroid Build Coastguard Worker } 36*c8dee2aaSAndroid Build Coastguard Worker } 37*c8dee2aaSAndroid Build Coastguard Worker 38*c8dee2aaSAndroid Build Coastguard Worker private: 39*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = Benchmark; 40*c8dee2aaSAndroid Build Coastguard Worker }; 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard Worker class PlacedRefCnt : public SkRefCnt { 43*c8dee2aaSAndroid Build Coastguard Worker public: PlacedRefCnt()44*c8dee2aaSAndroid Build Coastguard Worker PlacedRefCnt() : SkRefCnt() { } operator delete(void *)45*c8dee2aaSAndroid Build Coastguard Worker void operator delete(void*) { } 46*c8dee2aaSAndroid Build Coastguard Worker 47*c8dee2aaSAndroid Build Coastguard Worker private: 48*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = SkRefCnt; 49*c8dee2aaSAndroid Build Coastguard Worker }; 50*c8dee2aaSAndroid Build Coastguard Worker 51*c8dee2aaSAndroid Build Coastguard Worker class RefCntBench_Heap : public Benchmark { 52*c8dee2aaSAndroid Build Coastguard Worker public: isSuitableFor(Backend backend)53*c8dee2aaSAndroid Build Coastguard Worker bool isSuitableFor(Backend backend) override { 54*c8dee2aaSAndroid Build Coastguard Worker return backend == Backend::kNonRendering; 55*c8dee2aaSAndroid Build Coastguard Worker } 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Worker protected: onGetName()58*c8dee2aaSAndroid Build Coastguard Worker const char* onGetName() override { 59*c8dee2aaSAndroid Build Coastguard Worker return "ref_cnt_heap"; 60*c8dee2aaSAndroid Build Coastguard Worker } 61*c8dee2aaSAndroid Build Coastguard Worker onDraw(int loops,SkCanvas *)62*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas*) override { 63*c8dee2aaSAndroid Build Coastguard Worker char memory[sizeof(PlacedRefCnt)]; 64*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < loops; ++i) { 65*c8dee2aaSAndroid Build Coastguard Worker PlacedRefCnt* ref = new (memory) PlacedRefCnt(); 66*c8dee2aaSAndroid Build Coastguard Worker for (int j = 0; j < M; ++j) { 67*c8dee2aaSAndroid Build Coastguard Worker ref->ref(); 68*c8dee2aaSAndroid Build Coastguard Worker ref->unref(); 69*c8dee2aaSAndroid Build Coastguard Worker } 70*c8dee2aaSAndroid Build Coastguard Worker ref->unref(); 71*c8dee2aaSAndroid Build Coastguard Worker } 72*c8dee2aaSAndroid Build Coastguard Worker } 73*c8dee2aaSAndroid Build Coastguard Worker 74*c8dee2aaSAndroid Build Coastguard Worker private: 75*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = Benchmark; 76*c8dee2aaSAndroid Build Coastguard Worker }; 77*c8dee2aaSAndroid Build Coastguard Worker 78*c8dee2aaSAndroid Build Coastguard Worker class RefCntBench_New : public Benchmark { 79*c8dee2aaSAndroid Build Coastguard Worker public: isSuitableFor(Backend backend)80*c8dee2aaSAndroid Build Coastguard Worker bool isSuitableFor(Backend backend) override { 81*c8dee2aaSAndroid Build Coastguard Worker return backend == Backend::kNonRendering; 82*c8dee2aaSAndroid Build Coastguard Worker } 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker protected: onGetName()85*c8dee2aaSAndroid Build Coastguard Worker const char* onGetName() override { 86*c8dee2aaSAndroid Build Coastguard Worker return "ref_cnt_new"; 87*c8dee2aaSAndroid Build Coastguard Worker } 88*c8dee2aaSAndroid Build Coastguard Worker onDraw(int loops,SkCanvas *)89*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas*) override { 90*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < loops; ++i) { 91*c8dee2aaSAndroid Build Coastguard Worker SkRefCnt* ref = new SkRefCnt(); 92*c8dee2aaSAndroid Build Coastguard Worker for (int j = 0; j < M; ++j) { 93*c8dee2aaSAndroid Build Coastguard Worker ref->ref(); 94*c8dee2aaSAndroid Build Coastguard Worker ref->unref(); 95*c8dee2aaSAndroid Build Coastguard Worker } 96*c8dee2aaSAndroid Build Coastguard Worker ref->unref(); 97*c8dee2aaSAndroid Build Coastguard Worker } 98*c8dee2aaSAndroid Build Coastguard Worker } 99*c8dee2aaSAndroid Build Coastguard Worker 100*c8dee2aaSAndroid Build Coastguard Worker private: 101*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = Benchmark; 102*c8dee2aaSAndroid Build Coastguard Worker }; 103*c8dee2aaSAndroid Build Coastguard Worker 104*c8dee2aaSAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////// 105*c8dee2aaSAndroid Build Coastguard Worker 106*c8dee2aaSAndroid Build Coastguard Worker class WeakRefCntBench_Stack : public Benchmark { 107*c8dee2aaSAndroid Build Coastguard Worker public: isSuitableFor(Backend backend)108*c8dee2aaSAndroid Build Coastguard Worker bool isSuitableFor(Backend backend) override { 109*c8dee2aaSAndroid Build Coastguard Worker return backend == Backend::kNonRendering; 110*c8dee2aaSAndroid Build Coastguard Worker } 111*c8dee2aaSAndroid Build Coastguard Worker 112*c8dee2aaSAndroid Build Coastguard Worker protected: onGetName()113*c8dee2aaSAndroid Build Coastguard Worker const char* onGetName() override { 114*c8dee2aaSAndroid Build Coastguard Worker return "ref_cnt_stack_weak"; 115*c8dee2aaSAndroid Build Coastguard Worker } 116*c8dee2aaSAndroid Build Coastguard Worker onDraw(int loops,SkCanvas *)117*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas*) override { 118*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < loops; ++i) { 119*c8dee2aaSAndroid Build Coastguard Worker SkWeakRefCnt ref; 120*c8dee2aaSAndroid Build Coastguard Worker for (int j = 0; j < M; ++j) { 121*c8dee2aaSAndroid Build Coastguard Worker ref.ref(); 122*c8dee2aaSAndroid Build Coastguard Worker ref.unref(); 123*c8dee2aaSAndroid Build Coastguard Worker } 124*c8dee2aaSAndroid Build Coastguard Worker } 125*c8dee2aaSAndroid Build Coastguard Worker } 126*c8dee2aaSAndroid Build Coastguard Worker 127*c8dee2aaSAndroid Build Coastguard Worker private: 128*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = Benchmark; 129*c8dee2aaSAndroid Build Coastguard Worker }; 130*c8dee2aaSAndroid Build Coastguard Worker 131*c8dee2aaSAndroid Build Coastguard Worker class PlacedWeakRefCnt : public SkWeakRefCnt { 132*c8dee2aaSAndroid Build Coastguard Worker public: PlacedWeakRefCnt()133*c8dee2aaSAndroid Build Coastguard Worker PlacedWeakRefCnt() : SkWeakRefCnt() { } operator delete(void *)134*c8dee2aaSAndroid Build Coastguard Worker void operator delete(void*) { } 135*c8dee2aaSAndroid Build Coastguard Worker }; 136*c8dee2aaSAndroid Build Coastguard Worker 137*c8dee2aaSAndroid Build Coastguard Worker class WeakRefCntBench_Heap : public Benchmark { 138*c8dee2aaSAndroid Build Coastguard Worker public: isSuitableFor(Backend backend)139*c8dee2aaSAndroid Build Coastguard Worker bool isSuitableFor(Backend backend) override { 140*c8dee2aaSAndroid Build Coastguard Worker return backend == Backend::kNonRendering; 141*c8dee2aaSAndroid Build Coastguard Worker } 142*c8dee2aaSAndroid Build Coastguard Worker 143*c8dee2aaSAndroid Build Coastguard Worker protected: onGetName()144*c8dee2aaSAndroid Build Coastguard Worker const char* onGetName() override { 145*c8dee2aaSAndroid Build Coastguard Worker return "ref_cnt_heap_weak"; 146*c8dee2aaSAndroid Build Coastguard Worker } 147*c8dee2aaSAndroid Build Coastguard Worker onDraw(int loops,SkCanvas *)148*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas*) override { 149*c8dee2aaSAndroid Build Coastguard Worker char memory[sizeof(PlacedWeakRefCnt)]; 150*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < loops; ++i) { 151*c8dee2aaSAndroid Build Coastguard Worker PlacedWeakRefCnt* ref = new (memory) PlacedWeakRefCnt(); 152*c8dee2aaSAndroid Build Coastguard Worker for (int j = 0; j < M; ++j) { 153*c8dee2aaSAndroid Build Coastguard Worker ref->ref(); 154*c8dee2aaSAndroid Build Coastguard Worker ref->unref(); 155*c8dee2aaSAndroid Build Coastguard Worker } 156*c8dee2aaSAndroid Build Coastguard Worker ref->unref(); 157*c8dee2aaSAndroid Build Coastguard Worker } 158*c8dee2aaSAndroid Build Coastguard Worker } 159*c8dee2aaSAndroid Build Coastguard Worker 160*c8dee2aaSAndroid Build Coastguard Worker private: 161*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = Benchmark; 162*c8dee2aaSAndroid Build Coastguard Worker }; 163*c8dee2aaSAndroid Build Coastguard Worker 164*c8dee2aaSAndroid Build Coastguard Worker class WeakRefCntBench_New : public Benchmark { 165*c8dee2aaSAndroid Build Coastguard Worker public: isSuitableFor(Backend backend)166*c8dee2aaSAndroid Build Coastguard Worker bool isSuitableFor(Backend backend) override { 167*c8dee2aaSAndroid Build Coastguard Worker return backend == Backend::kNonRendering; 168*c8dee2aaSAndroid Build Coastguard Worker } 169*c8dee2aaSAndroid Build Coastguard Worker 170*c8dee2aaSAndroid Build Coastguard Worker protected: onGetName()171*c8dee2aaSAndroid Build Coastguard Worker const char* onGetName() override { 172*c8dee2aaSAndroid Build Coastguard Worker return "ref_cnt_new_weak"; 173*c8dee2aaSAndroid Build Coastguard Worker } 174*c8dee2aaSAndroid Build Coastguard Worker onDraw(int loops,SkCanvas *)175*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas*) override { 176*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < loops; ++i) { 177*c8dee2aaSAndroid Build Coastguard Worker SkWeakRefCnt* ref = new SkWeakRefCnt(); 178*c8dee2aaSAndroid Build Coastguard Worker for (int j = 0; j < M; ++j) { 179*c8dee2aaSAndroid Build Coastguard Worker ref->ref(); 180*c8dee2aaSAndroid Build Coastguard Worker ref->unref(); 181*c8dee2aaSAndroid Build Coastguard Worker } 182*c8dee2aaSAndroid Build Coastguard Worker ref->unref(); 183*c8dee2aaSAndroid Build Coastguard Worker } 184*c8dee2aaSAndroid Build Coastguard Worker } 185*c8dee2aaSAndroid Build Coastguard Worker 186*c8dee2aaSAndroid Build Coastguard Worker private: 187*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = Benchmark; 188*c8dee2aaSAndroid Build Coastguard Worker }; 189*c8dee2aaSAndroid Build Coastguard Worker 190*c8dee2aaSAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////// 191*c8dee2aaSAndroid Build Coastguard Worker 192*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new RefCntBench_Stack(); ) 193*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new RefCntBench_Heap(); ) 194*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new RefCntBench_New(); ) 195*c8dee2aaSAndroid Build Coastguard Worker 196*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new WeakRefCntBench_Stack(); ) 197*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new WeakRefCntBench_Heap(); ) 198*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new WeakRefCntBench_New(); ) 199