/* * Copyright 2012 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "SkBenchmark.h" #include "SkRefCnt.h" #include "SkThread.h" #include "SkWeakRefCnt.h" #include enum { N = SkBENCHLOOP(100000), M = SkBENCHLOOP(2) }; class RefCntBench_Stack : public SkBenchmark { public: RefCntBench_Stack(void* param) : INHERITED(param) { fIsRendering = false; } protected: virtual const char* onGetName() { return "ref_cnt_stack"; } virtual void onDraw(SkCanvas* canvas) { for (int i = 0; i < N; ++i) { SkRefCnt ref; for (int j = 0; j < M; ++j) { ref.ref(); ref.unref(); } } } private: typedef SkBenchmark INHERITED; }; class PlacedRefCnt : public SkRefCnt { public: SK_DECLARE_INST_COUNT(PlacedRefCnt) PlacedRefCnt() : SkRefCnt() { } void operator delete(void *p) { } private: typedef SkRefCnt INHERITED; }; SK_DEFINE_INST_COUNT(PlacedRefCnt) class RefCntBench_Heap : public SkBenchmark { public: RefCntBench_Heap(void* param) : INHERITED(param) { fIsRendering = false; } protected: virtual const char* onGetName() { return "ref_cnt_heap"; } virtual void onDraw(SkCanvas* canvas) { char memory[sizeof(PlacedRefCnt)]; for (int i = 0; i < N; ++i) { PlacedRefCnt* ref = new (memory) PlacedRefCnt(); for (int j = 0; j < M; ++j) { ref->ref(); ref->unref(); } ref->unref(); } } private: typedef SkBenchmark INHERITED; }; class RefCntBench_New : public SkBenchmark { public: RefCntBench_New(void* param) : INHERITED(param) { fIsRendering = false; } protected: virtual const char* onGetName() { return "ref_cnt_new"; } virtual void onDraw(SkCanvas* canvas) { for (int i = 0; i < N; ++i) { SkRefCnt* ref = new SkRefCnt(); for (int j = 0; j < M; ++j) { ref->ref(); ref->unref(); } ref->unref(); } } private: typedef SkBenchmark INHERITED; }; /////////////////////////////////////////////////////////////////////////////// class WeakRefCntBench_Stack : public SkBenchmark { public: WeakRefCntBench_Stack(void* param) : INHERITED(param) { fIsRendering = false; } protected: virtual const char* onGetName() { return "ref_cnt_stack_weak"; } virtual void onDraw(SkCanvas* canvas) { for (int i = 0; i < N; ++i) { SkWeakRefCnt ref; for (int j = 0; j < M; ++j) { ref.ref(); ref.unref(); } } } private: typedef SkBenchmark INHERITED; }; class PlacedWeakRefCnt : public SkWeakRefCnt { public: PlacedWeakRefCnt() : SkWeakRefCnt() { } void operator delete(void *p) { } }; class WeakRefCntBench_Heap : public SkBenchmark { public: WeakRefCntBench_Heap(void* param) : INHERITED(param) { fIsRendering = false; } protected: virtual const char* onGetName() { return "ref_cnt_heap_weak"; } virtual void onDraw(SkCanvas* canvas) { char memory[sizeof(PlacedWeakRefCnt)]; for (int i = 0; i < N; ++i) { PlacedWeakRefCnt* ref = new (memory) PlacedWeakRefCnt(); for (int j = 0; j < M; ++j) { ref->ref(); ref->unref(); } ref->unref(); } } private: typedef SkBenchmark INHERITED; }; class WeakRefCntBench_New : public SkBenchmark { public: WeakRefCntBench_New(void* param) : INHERITED(param) { fIsRendering = false; } protected: virtual const char* onGetName() { return "ref_cnt_new_weak"; } virtual void onDraw(SkCanvas* canvas) { for (int i = 0; i < N; ++i) { SkWeakRefCnt* ref = new SkWeakRefCnt(); for (int j = 0; j < M; ++j) { ref->ref(); ref->unref(); } ref->unref(); } } private: typedef SkBenchmark INHERITED; }; /////////////////////////////////////////////////////////////////////////////// static SkBenchmark* Fact00(void* p) { return new RefCntBench_Stack(p); } static SkBenchmark* Fact01(void* p) { return new RefCntBench_Heap(p); } static SkBenchmark* Fact02(void* p) { return new RefCntBench_New(p); } static SkBenchmark* Fact10(void* p) { return new WeakRefCntBench_Stack(p); } static SkBenchmark* Fact11(void* p) { return new WeakRefCntBench_Heap(p); } static SkBenchmark* Fact12(void* p) { return new WeakRefCntBench_New(p); } static BenchRegistry gReg00(Fact00); static BenchRegistry gReg01(Fact01); static BenchRegistry gReg02(Fact02); static BenchRegistry gReg10(Fact10); static BenchRegistry gReg11(Fact11); static BenchRegistry gReg12(Fact12);