| /* |
| * 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 "bench/Benchmark.h" |
| #include "include/core/SkRefCnt.h" |
| #include "include/private/SkWeakRefCnt.h" |
| #include <memory> |
| #include <new> |
| |
| enum { |
| M = 2 |
| }; |
| |
| class RefCntBench_Stack : public Benchmark { |
| public: |
| bool isSuitableFor(Backend backend) override { |
| return backend == Backend::kNonRendering; |
| } |
| |
| protected: |
| const char* onGetName() override { |
| return "ref_cnt_stack"; |
| } |
| |
| void onDraw(int loops, SkCanvas*) override { |
| for (int i = 0; i < loops; ++i) { |
| SkRefCnt ref; |
| for (int j = 0; j < M; ++j) { |
| ref.ref(); |
| ref.unref(); |
| } |
| } |
| } |
| |
| private: |
| using INHERITED = Benchmark; |
| }; |
| |
| class PlacedRefCnt : public SkRefCnt { |
| public: |
| PlacedRefCnt() : SkRefCnt() { } |
| void operator delete(void*) { } |
| |
| private: |
| using INHERITED = SkRefCnt; |
| }; |
| |
| class RefCntBench_Heap : public Benchmark { |
| public: |
| bool isSuitableFor(Backend backend) override { |
| return backend == Backend::kNonRendering; |
| } |
| |
| protected: |
| const char* onGetName() override { |
| return "ref_cnt_heap"; |
| } |
| |
| void onDraw(int loops, SkCanvas*) override { |
| char memory[sizeof(PlacedRefCnt)]; |
| for (int i = 0; i < loops; ++i) { |
| PlacedRefCnt* ref = new (memory) PlacedRefCnt(); |
| for (int j = 0; j < M; ++j) { |
| ref->ref(); |
| ref->unref(); |
| } |
| ref->unref(); |
| } |
| } |
| |
| private: |
| using INHERITED = Benchmark; |
| }; |
| |
| class RefCntBench_New : public Benchmark { |
| public: |
| bool isSuitableFor(Backend backend) override { |
| return backend == Backend::kNonRendering; |
| } |
| |
| protected: |
| const char* onGetName() override { |
| return "ref_cnt_new"; |
| } |
| |
| void onDraw(int loops, SkCanvas*) override { |
| for (int i = 0; i < loops; ++i) { |
| SkRefCnt* ref = new SkRefCnt(); |
| for (int j = 0; j < M; ++j) { |
| ref->ref(); |
| ref->unref(); |
| } |
| ref->unref(); |
| } |
| } |
| |
| private: |
| using INHERITED = Benchmark; |
| }; |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| class WeakRefCntBench_Stack : public Benchmark { |
| public: |
| bool isSuitableFor(Backend backend) override { |
| return backend == Backend::kNonRendering; |
| } |
| |
| protected: |
| const char* onGetName() override { |
| return "ref_cnt_stack_weak"; |
| } |
| |
| void onDraw(int loops, SkCanvas*) override { |
| for (int i = 0; i < loops; ++i) { |
| SkWeakRefCnt ref; |
| for (int j = 0; j < M; ++j) { |
| ref.ref(); |
| ref.unref(); |
| } |
| } |
| } |
| |
| private: |
| using INHERITED = Benchmark; |
| }; |
| |
| class PlacedWeakRefCnt : public SkWeakRefCnt { |
| public: |
| PlacedWeakRefCnt() : SkWeakRefCnt() { } |
| void operator delete(void*) { } |
| }; |
| |
| class WeakRefCntBench_Heap : public Benchmark { |
| public: |
| bool isSuitableFor(Backend backend) override { |
| return backend == Backend::kNonRendering; |
| } |
| |
| protected: |
| const char* onGetName() override { |
| return "ref_cnt_heap_weak"; |
| } |
| |
| void onDraw(int loops, SkCanvas*) override { |
| char memory[sizeof(PlacedWeakRefCnt)]; |
| for (int i = 0; i < loops; ++i) { |
| PlacedWeakRefCnt* ref = new (memory) PlacedWeakRefCnt(); |
| for (int j = 0; j < M; ++j) { |
| ref->ref(); |
| ref->unref(); |
| } |
| ref->unref(); |
| } |
| } |
| |
| private: |
| using INHERITED = Benchmark; |
| }; |
| |
| class WeakRefCntBench_New : public Benchmark { |
| public: |
| bool isSuitableFor(Backend backend) override { |
| return backend == Backend::kNonRendering; |
| } |
| |
| protected: |
| const char* onGetName() override { |
| return "ref_cnt_new_weak"; |
| } |
| |
| void onDraw(int loops, SkCanvas*) override { |
| for (int i = 0; i < loops; ++i) { |
| SkWeakRefCnt* ref = new SkWeakRefCnt(); |
| for (int j = 0; j < M; ++j) { |
| ref->ref(); |
| ref->unref(); |
| } |
| ref->unref(); |
| } |
| } |
| |
| private: |
| using INHERITED = Benchmark; |
| }; |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| DEF_BENCH( return new RefCntBench_Stack(); ) |
| DEF_BENCH( return new RefCntBench_Heap(); ) |
| DEF_BENCH( return new RefCntBench_New(); ) |
| |
| DEF_BENCH( return new WeakRefCntBench_Stack(); ) |
| DEF_BENCH( return new WeakRefCntBench_Heap(); ) |
| DEF_BENCH( return new WeakRefCntBench_New(); ) |