benchmarks.h 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. #pragma once
  2. // Define BENCHMARK_PREFIX and BENCHMARKED_CLASS before including this file.
  3. #include <util/generic/xrange.h>
  4. #define Y_CPU_PREFIXED_BENCHMARK_HELPER(prefix, name, iface) Y_CPU_BENCHMARK(prefix##name, iface)
  5. #define Y_CPU_PREFIXED_BENCHMARK(prefix, name, iface) Y_CPU_PREFIXED_BENCHMARK_HELPER(prefix, name, iface)
  6. #define CONCATENATE3_HELPER(a, b, c) a##b##c
  7. #define CONCATENATE3(a, b, c) CONCATENATE3_HELPER(a, b, c)
  8. namespace {
  9. namespace CONCATENATE3(N, BENCHMARK_PREFIX, Benchmark) {
  10. using TBenchmarkedClass = BENCHMARKED_CLASS;
  11. const auto defaultString = TBenchmarkedClass();
  12. const auto emptyString = TBenchmarkedClass("");
  13. const auto lengthOneString = TBenchmarkedClass("1");
  14. const auto length1KString = TBenchmarkedClass(1000, '1');
  15. Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CreateDefault, iface) {
  16. for (const auto i : xrange(iface.Iterations())) {
  17. Y_UNUSED(i);
  18. auto result = TBenchmarkedClass();
  19. Y_DO_NOT_OPTIMIZE_AWAY(result);
  20. }
  21. }
  22. Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CreateFromEmptyLiteral, iface) {
  23. for (const auto i : xrange(iface.Iterations())) {
  24. Y_UNUSED(i);
  25. auto result = TBenchmarkedClass("");
  26. Y_DO_NOT_OPTIMIZE_AWAY(result);
  27. }
  28. }
  29. Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CreateFromLengthOneLiteral, iface) {
  30. for (const auto i : xrange(iface.Iterations())) {
  31. Y_UNUSED(i);
  32. auto result = TBenchmarkedClass("1");
  33. Y_DO_NOT_OPTIMIZE_AWAY(result);
  34. }
  35. }
  36. Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CreateLength1K, iface) {
  37. for (const auto i : xrange(iface.Iterations())) {
  38. Y_UNUSED(i);
  39. auto result = TBenchmarkedClass(1000, '1');
  40. Y_DO_NOT_OPTIMIZE_AWAY(result);
  41. }
  42. }
  43. Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CopyDefaultString, iface) {
  44. const auto& sourceString = defaultString;
  45. for (const auto i : xrange(iface.Iterations())) {
  46. Y_UNUSED(i);
  47. auto result = TBenchmarkedClass(sourceString);
  48. Y_DO_NOT_OPTIMIZE_AWAY(result);
  49. }
  50. }
  51. Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CopyEmptyString, iface) {
  52. const auto& sourceString = emptyString;
  53. for (const auto i : xrange(iface.Iterations())) {
  54. Y_UNUSED(i);
  55. auto result = TBenchmarkedClass(sourceString);
  56. Y_DO_NOT_OPTIMIZE_AWAY(result);
  57. }
  58. }
  59. Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CopyLengthOneString, iface) {
  60. const auto& sourceString = lengthOneString;
  61. for (const auto i : xrange(iface.Iterations())) {
  62. Y_UNUSED(i);
  63. auto result = TBenchmarkedClass(sourceString);
  64. Y_DO_NOT_OPTIMIZE_AWAY(result);
  65. }
  66. }
  67. Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CopyLength1KString, iface) {
  68. const auto& sourceString = length1KString;
  69. for (const auto i : xrange(iface.Iterations())) {
  70. Y_UNUSED(i);
  71. auto result = TBenchmarkedClass(sourceString);
  72. Y_DO_NOT_OPTIMIZE_AWAY(result);
  73. }
  74. }
  75. Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CopyAndUpdateLengthOneString, iface) {
  76. const auto& sourceString = lengthOneString;
  77. for (const auto i : xrange(iface.Iterations())) {
  78. Y_UNUSED(i);
  79. auto targetString = TBenchmarkedClass(sourceString);
  80. auto result = targetString[0] = '0';
  81. Y_DO_NOT_OPTIMIZE_AWAY(targetString);
  82. Y_DO_NOT_OPTIMIZE_AWAY(result);
  83. }
  84. }
  85. Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CopyAndAppendDefaultString, iface) {
  86. const auto& sourceString = defaultString;
  87. const TBenchmarkedClass::size_type insertPosition = sourceString.size();
  88. for (const auto i : xrange(iface.Iterations())) {
  89. Y_UNUSED(i);
  90. auto targetString = TBenchmarkedClass(sourceString);
  91. auto result = targetString.insert(insertPosition, 1, '0');
  92. Y_DO_NOT_OPTIMIZE_AWAY(targetString);
  93. Y_DO_NOT_OPTIMIZE_AWAY(result);
  94. }
  95. }
  96. Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CopyAndAppendEmptyString, iface) {
  97. const auto& sourceString = emptyString;
  98. const TBenchmarkedClass::size_type insertPosition = sourceString.size();
  99. for (const auto i : xrange(iface.Iterations())) {
  100. Y_UNUSED(i);
  101. auto targetString = TBenchmarkedClass(sourceString);
  102. auto result = targetString.insert(insertPosition, 1, '0');
  103. Y_DO_NOT_OPTIMIZE_AWAY(targetString);
  104. Y_DO_NOT_OPTIMIZE_AWAY(result);
  105. }
  106. }
  107. Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CopyAndAppendLengthOneString, iface) {
  108. const auto& sourceString = lengthOneString;
  109. const TBenchmarkedClass::size_type insertPosition = sourceString.size();
  110. for (const auto i : xrange(iface.Iterations())) {
  111. Y_UNUSED(i);
  112. auto targetString = TBenchmarkedClass(sourceString);
  113. auto result = targetString.insert(insertPosition, 1, '0');
  114. Y_DO_NOT_OPTIMIZE_AWAY(targetString);
  115. Y_DO_NOT_OPTIMIZE_AWAY(result);
  116. }
  117. }
  118. Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CopyAndPrependLengthOneString, iface) {
  119. const auto& sourceString = lengthOneString;
  120. const TBenchmarkedClass::size_type insertPosition = 0;
  121. for (const auto i : xrange(iface.Iterations())) {
  122. Y_UNUSED(i);
  123. auto targetString = TBenchmarkedClass(sourceString);
  124. auto result = targetString.insert(insertPosition, 1, '0');
  125. Y_DO_NOT_OPTIMIZE_AWAY(targetString);
  126. Y_DO_NOT_OPTIMIZE_AWAY(result);
  127. }
  128. }
  129. Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CopyAndUpdateLength1KString, iface) {
  130. const auto& sourceString = length1KString;
  131. for (const auto i : xrange(iface.Iterations())) {
  132. Y_UNUSED(i);
  133. auto targetString = TBenchmarkedClass(sourceString);
  134. auto result = targetString[0] = '0';
  135. Y_DO_NOT_OPTIMIZE_AWAY(targetString);
  136. Y_DO_NOT_OPTIMIZE_AWAY(result);
  137. }
  138. }
  139. Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CopyAndAppendLength1KString, iface) {
  140. const auto& sourceString = length1KString;
  141. const TBenchmarkedClass::size_type insertPosition = sourceString.size();
  142. for (const auto i : xrange(iface.Iterations())) {
  143. Y_UNUSED(i);
  144. auto targetString = TBenchmarkedClass(sourceString);
  145. auto result = targetString.insert(insertPosition, 1, '0');
  146. Y_DO_NOT_OPTIMIZE_AWAY(targetString);
  147. Y_DO_NOT_OPTIMIZE_AWAY(result);
  148. }
  149. }
  150. Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CopyAndPrependLength1KString, iface) {
  151. const auto& sourceString = length1KString;
  152. const TBenchmarkedClass::size_type insertPosition = 0;
  153. for (const auto i : xrange(iface.Iterations())) {
  154. Y_UNUSED(i);
  155. auto targetString = TBenchmarkedClass(sourceString);
  156. auto result = targetString.insert(insertPosition, 1, '0');
  157. Y_DO_NOT_OPTIMIZE_AWAY(targetString);
  158. Y_DO_NOT_OPTIMIZE_AWAY(result);
  159. }
  160. }
  161. }
  162. }
  163. #undef CONCATENATE3
  164. #undef CONCATENATE3_HELPER
  165. #undef Y_CPU_PREFIXED_BENCHMARK
  166. #undef Y_CPU_PREFIXED_BENCHMARK_HELPER