RefCntBench.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  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 "bench/Benchmark.h"
  8. #include "include/core/SkRefCnt.h"
  9. #include "include/private/SkWeakRefCnt.h"
  10. #include <memory>
  11. #include <new>
  12. enum {
  13. M = 2
  14. };
  15. class RefCntBench_Stack : public Benchmark {
  16. public:
  17. bool isSuitableFor(Backend backend) override {
  18. return backend == kNonRendering_Backend;
  19. }
  20. protected:
  21. const char* onGetName() override {
  22. return "ref_cnt_stack";
  23. }
  24. void onDraw(int loops, SkCanvas*) override {
  25. for (int i = 0; i < loops; ++i) {
  26. SkRefCnt ref;
  27. for (int j = 0; j < M; ++j) {
  28. ref.ref();
  29. ref.unref();
  30. }
  31. }
  32. }
  33. private:
  34. typedef Benchmark INHERITED;
  35. };
  36. class PlacedRefCnt : public SkRefCnt {
  37. public:
  38. PlacedRefCnt() : SkRefCnt() { }
  39. void operator delete(void*) { }
  40. private:
  41. typedef SkRefCnt INHERITED;
  42. };
  43. class RefCntBench_Heap : public Benchmark {
  44. public:
  45. bool isSuitableFor(Backend backend) override {
  46. return backend == kNonRendering_Backend;
  47. }
  48. protected:
  49. const char* onGetName() override {
  50. return "ref_cnt_heap";
  51. }
  52. void onDraw(int loops, SkCanvas*) override {
  53. char memory[sizeof(PlacedRefCnt)];
  54. for (int i = 0; i < loops; ++i) {
  55. PlacedRefCnt* ref = new (memory) PlacedRefCnt();
  56. for (int j = 0; j < M; ++j) {
  57. ref->ref();
  58. ref->unref();
  59. }
  60. ref->unref();
  61. }
  62. }
  63. private:
  64. typedef Benchmark INHERITED;
  65. };
  66. class RefCntBench_New : public Benchmark {
  67. public:
  68. bool isSuitableFor(Backend backend) override {
  69. return backend == kNonRendering_Backend;
  70. }
  71. protected:
  72. const char* onGetName() override {
  73. return "ref_cnt_new";
  74. }
  75. void onDraw(int loops, SkCanvas*) override {
  76. for (int i = 0; i < loops; ++i) {
  77. SkRefCnt* ref = new SkRefCnt();
  78. for (int j = 0; j < M; ++j) {
  79. ref->ref();
  80. ref->unref();
  81. }
  82. ref->unref();
  83. }
  84. }
  85. private:
  86. typedef Benchmark INHERITED;
  87. };
  88. ///////////////////////////////////////////////////////////////////////////////
  89. class WeakRefCntBench_Stack : public Benchmark {
  90. public:
  91. bool isSuitableFor(Backend backend) override {
  92. return backend == kNonRendering_Backend;
  93. }
  94. protected:
  95. const char* onGetName() override {
  96. return "ref_cnt_stack_weak";
  97. }
  98. void onDraw(int loops, SkCanvas*) override {
  99. for (int i = 0; i < loops; ++i) {
  100. SkWeakRefCnt ref;
  101. for (int j = 0; j < M; ++j) {
  102. ref.ref();
  103. ref.unref();
  104. }
  105. }
  106. }
  107. private:
  108. typedef Benchmark INHERITED;
  109. };
  110. class PlacedWeakRefCnt : public SkWeakRefCnt {
  111. public:
  112. PlacedWeakRefCnt() : SkWeakRefCnt() { }
  113. void operator delete(void*) { }
  114. };
  115. class WeakRefCntBench_Heap : public Benchmark {
  116. public:
  117. bool isSuitableFor(Backend backend) override {
  118. return backend == kNonRendering_Backend;
  119. }
  120. protected:
  121. const char* onGetName() override {
  122. return "ref_cnt_heap_weak";
  123. }
  124. void onDraw(int loops, SkCanvas*) override {
  125. char memory[sizeof(PlacedWeakRefCnt)];
  126. for (int i = 0; i < loops; ++i) {
  127. PlacedWeakRefCnt* ref = new (memory) PlacedWeakRefCnt();
  128. for (int j = 0; j < M; ++j) {
  129. ref->ref();
  130. ref->unref();
  131. }
  132. ref->unref();
  133. }
  134. }
  135. private:
  136. typedef Benchmark INHERITED;
  137. };
  138. class WeakRefCntBench_New : public Benchmark {
  139. public:
  140. bool isSuitableFor(Backend backend) override {
  141. return backend == kNonRendering_Backend;
  142. }
  143. protected:
  144. const char* onGetName() override {
  145. return "ref_cnt_new_weak";
  146. }
  147. void onDraw(int loops, SkCanvas*) override {
  148. for (int i = 0; i < loops; ++i) {
  149. SkWeakRefCnt* ref = new SkWeakRefCnt();
  150. for (int j = 0; j < M; ++j) {
  151. ref->ref();
  152. ref->unref();
  153. }
  154. ref->unref();
  155. }
  156. }
  157. private:
  158. typedef Benchmark INHERITED;
  159. };
  160. ///////////////////////////////////////////////////////////////////////////////
  161. DEF_BENCH( return new RefCntBench_Stack(); )
  162. DEF_BENCH( return new RefCntBench_Heap(); )
  163. DEF_BENCH( return new RefCntBench_New(); )
  164. DEF_BENCH( return new WeakRefCntBench_Stack(); )
  165. DEF_BENCH( return new WeakRefCntBench_Heap(); )
  166. DEF_BENCH( return new WeakRefCntBench_New(); )