180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2012 Google Inc. 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkBenchmark.h" 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkRefCnt.h" 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkThread.h" 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkWeakRefCnt.h" 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include <memory> 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruenum { 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru N = SkBENCHLOOP(100000), 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru M = SkBENCHLOOP(2) 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass RefCntBench_Stack : public SkBenchmark { 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru RefCntBench_Stack(void* param) : INHERITED(param) { 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fIsRendering = false; 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected: 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual const char* onGetName() { 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return "ref_cnt_stack"; 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void onDraw(SkCanvas* canvas) { 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int i = 0; i < N; ++i) { 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkRefCnt ref; 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int j = 0; j < M; ++j) { 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ref.ref(); 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ref.unref(); 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru typedef SkBenchmark INHERITED; 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass PlacedRefCnt : public SkRefCnt { 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SK_DECLARE_INST_COUNT(PlacedRefCnt) 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru PlacedRefCnt() : SkRefCnt() { } 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void operator delete(void *p) { } 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru typedef SkRefCnt INHERITED; 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSK_DEFINE_INST_COUNT(PlacedRefCnt) 5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass RefCntBench_Heap : public SkBenchmark { 5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru RefCntBench_Heap(void* param) : INHERITED(param) { 5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fIsRendering = false; 5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected: 6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual const char* onGetName() { 6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return "ref_cnt_heap"; 6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void onDraw(SkCanvas* canvas) { 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru char memory[sizeof(PlacedRefCnt)]; 6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int i = 0; i < N; ++i) { 6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru PlacedRefCnt* ref = new (memory) PlacedRefCnt(); 6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int j = 0; j < M; ++j) { 7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ref->ref(); 7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ref->unref(); 7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ref->unref(); 7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru typedef SkBenchmark INHERITED; 7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass RefCntBench_New : public SkBenchmark { 8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru RefCntBench_New(void* param) : INHERITED(param) { 8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fIsRendering = false; 8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected: 8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual const char* onGetName() { 8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return "ref_cnt_new"; 8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void onDraw(SkCanvas* canvas) { 9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int i = 0; i < N; ++i) { 9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkRefCnt* ref = new SkRefCnt(); 9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int j = 0; j < M; ++j) { 9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ref->ref(); 9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ref->unref(); 9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ref->unref(); 9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru typedef SkBenchmark INHERITED; 10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/////////////////////////////////////////////////////////////////////////////// 10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass WeakRefCntBench_Stack : public SkBenchmark { 10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru WeakRefCntBench_Stack(void* param) : INHERITED(param) { 11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fIsRendering = false; 11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected: 11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual const char* onGetName() { 11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return "ref_cnt_stack_weak"; 11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void onDraw(SkCanvas* canvas) { 11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int i = 0; i < N; ++i) { 12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkWeakRefCnt ref; 12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int j = 0; j < M; ++j) { 12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ref.ref(); 12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ref.unref(); 12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru typedef SkBenchmark INHERITED; 13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass PlacedWeakRefCnt : public SkWeakRefCnt { 13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 13480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru PlacedWeakRefCnt() : SkWeakRefCnt() { } 13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void operator delete(void *p) { } 13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 13780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 13880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass WeakRefCntBench_Heap : public SkBenchmark { 13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru WeakRefCntBench_Heap(void* param) : INHERITED(param) { 14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fIsRendering = false; 14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected: 14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual const char* onGetName() { 14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return "ref_cnt_heap_weak"; 14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void onDraw(SkCanvas* canvas) { 14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru char memory[sizeof(PlacedWeakRefCnt)]; 15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int i = 0; i < N; ++i) { 15180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru PlacedWeakRefCnt* ref = new (memory) PlacedWeakRefCnt(); 15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int j = 0; j < M; ++j) { 15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ref->ref(); 15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ref->unref(); 15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ref->unref(); 15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 16080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 16180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru typedef SkBenchmark INHERITED; 16280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 16380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 16480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass WeakRefCntBench_New : public SkBenchmark { 16580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 16680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru WeakRefCntBench_New(void* param) : INHERITED(param) { 16780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fIsRendering = false; 16880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 16980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected: 17080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual const char* onGetName() { 17180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return "ref_cnt_new_weak"; 17280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 17380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 17480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void onDraw(SkCanvas* canvas) { 17580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int i = 0; i < N; ++i) { 17680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkWeakRefCnt* ref = new SkWeakRefCnt(); 17780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int j = 0; j < M; ++j) { 17880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ref->ref(); 17980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ref->unref(); 18080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 18180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ref->unref(); 18280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 18380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 18480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 18580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 18680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru typedef SkBenchmark INHERITED; 18780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 18880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 18980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/////////////////////////////////////////////////////////////////////////////// 19080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 19180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkBenchmark* Fact00(void* p) { return new RefCntBench_Stack(p); } 19280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkBenchmark* Fact01(void* p) { return new RefCntBench_Heap(p); } 19380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkBenchmark* Fact02(void* p) { return new RefCntBench_New(p); } 19480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 19580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkBenchmark* Fact10(void* p) { return new WeakRefCntBench_Stack(p); } 19680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkBenchmark* Fact11(void* p) { return new WeakRefCntBench_Heap(p); } 19780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkBenchmark* Fact12(void* p) { return new WeakRefCntBench_New(p); } 19880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 19980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic BenchRegistry gReg00(Fact00); 20080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic BenchRegistry gReg01(Fact01); 20180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic BenchRegistry gReg02(Fact02); 20280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 20380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic BenchRegistry gReg10(Fact10); 20480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic BenchRegistry gReg11(Fact11); 20580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic BenchRegistry gReg12(Fact12); 206