bm_metadata.cc 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. /*
  2. *
  3. * Copyright 2017 gRPC authors.
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. *
  17. */
  18. /* Test out various metadata handling primitives */
  19. #include <benchmark/benchmark.h>
  20. #include <grpc/grpc.h>
  21. extern "C" {
  22. #include "src/core/lib/transport/metadata.h"
  23. #include "src/core/lib/transport/static_metadata.h"
  24. }
  25. #include "test/cpp/microbenchmarks/helpers.h"
  26. auto& force_library_initialization = Library::get();
  27. static void BM_SliceFromStatic(benchmark::State& state) {
  28. TrackCounters track_counters;
  29. while (state.KeepRunning()) {
  30. benchmark::DoNotOptimize(grpc_slice_from_static_string("abc"));
  31. }
  32. track_counters.Finish(state);
  33. }
  34. BENCHMARK(BM_SliceFromStatic);
  35. static void BM_SliceFromCopied(benchmark::State& state) {
  36. TrackCounters track_counters;
  37. while (state.KeepRunning()) {
  38. grpc_slice_unref(grpc_slice_from_copied_string("abc"));
  39. }
  40. track_counters.Finish(state);
  41. }
  42. BENCHMARK(BM_SliceFromCopied);
  43. static void BM_SliceIntern(benchmark::State& state) {
  44. TrackCounters track_counters;
  45. gpr_slice slice = grpc_slice_from_static_string("abc");
  46. while (state.KeepRunning()) {
  47. grpc_slice_unref(grpc_slice_intern(slice));
  48. }
  49. track_counters.Finish(state);
  50. }
  51. BENCHMARK(BM_SliceIntern);
  52. static void BM_SliceReIntern(benchmark::State& state) {
  53. TrackCounters track_counters;
  54. gpr_slice slice = grpc_slice_intern(grpc_slice_from_static_string("abc"));
  55. while (state.KeepRunning()) {
  56. grpc_slice_unref(grpc_slice_intern(slice));
  57. }
  58. grpc_slice_unref(slice);
  59. track_counters.Finish(state);
  60. }
  61. BENCHMARK(BM_SliceReIntern);
  62. static void BM_SliceInternStaticMetadata(benchmark::State& state) {
  63. TrackCounters track_counters;
  64. while (state.KeepRunning()) {
  65. grpc_slice_intern(GRPC_MDSTR_GZIP);
  66. }
  67. track_counters.Finish(state);
  68. }
  69. BENCHMARK(BM_SliceInternStaticMetadata);
  70. static void BM_SliceInternEqualToStaticMetadata(benchmark::State& state) {
  71. TrackCounters track_counters;
  72. gpr_slice slice = grpc_slice_from_static_string("gzip");
  73. while (state.KeepRunning()) {
  74. grpc_slice_intern(slice);
  75. }
  76. track_counters.Finish(state);
  77. }
  78. BENCHMARK(BM_SliceInternEqualToStaticMetadata);
  79. static void BM_MetadataFromNonInternedSlices(benchmark::State& state) {
  80. TrackCounters track_counters;
  81. gpr_slice k = grpc_slice_from_static_string("key");
  82. gpr_slice v = grpc_slice_from_static_string("value");
  83. ExecCtx _local_exec_ctx;
  84. while (state.KeepRunning()) {
  85. GRPC_MDELEM_UNREF(grpc_mdelem_create(k, v, NULL));
  86. }
  87. grpc_exec_ctx_finish();
  88. track_counters.Finish(state);
  89. }
  90. BENCHMARK(BM_MetadataFromNonInternedSlices);
  91. static void BM_MetadataFromInternedSlices(benchmark::State& state) {
  92. TrackCounters track_counters;
  93. gpr_slice k = grpc_slice_intern(grpc_slice_from_static_string("key"));
  94. gpr_slice v = grpc_slice_intern(grpc_slice_from_static_string("value"));
  95. ExecCtx _local_exec_ctx;
  96. while (state.KeepRunning()) {
  97. GRPC_MDELEM_UNREF(grpc_mdelem_create(k, v, NULL));
  98. }
  99. grpc_exec_ctx_finish();
  100. grpc_slice_unref(k);
  101. grpc_slice_unref(v);
  102. track_counters.Finish(state);
  103. }
  104. BENCHMARK(BM_MetadataFromInternedSlices);
  105. static void BM_MetadataFromInternedSlicesAlreadyInIndex(
  106. benchmark::State& state) {
  107. TrackCounters track_counters;
  108. gpr_slice k = grpc_slice_intern(grpc_slice_from_static_string("key"));
  109. gpr_slice v = grpc_slice_intern(grpc_slice_from_static_string("value"));
  110. ExecCtx _local_exec_ctx;
  111. grpc_mdelem seed = grpc_mdelem_create(k, v, NULL);
  112. while (state.KeepRunning()) {
  113. GRPC_MDELEM_UNREF(grpc_mdelem_create(k, v, NULL));
  114. }
  115. GRPC_MDELEM_UNREF(seed);
  116. grpc_exec_ctx_finish();
  117. grpc_slice_unref(k);
  118. grpc_slice_unref(v);
  119. track_counters.Finish(state);
  120. }
  121. BENCHMARK(BM_MetadataFromInternedSlicesAlreadyInIndex);
  122. static void BM_MetadataFromInternedKey(benchmark::State& state) {
  123. TrackCounters track_counters;
  124. gpr_slice k = grpc_slice_intern(grpc_slice_from_static_string("key"));
  125. gpr_slice v = grpc_slice_from_static_string("value");
  126. ExecCtx _local_exec_ctx;
  127. while (state.KeepRunning()) {
  128. GRPC_MDELEM_UNREF(grpc_mdelem_create(k, v, NULL));
  129. }
  130. grpc_exec_ctx_finish();
  131. grpc_slice_unref(k);
  132. track_counters.Finish(state);
  133. }
  134. BENCHMARK(BM_MetadataFromInternedKey);
  135. static void BM_MetadataFromNonInternedSlicesWithBackingStore(
  136. benchmark::State& state) {
  137. TrackCounters track_counters;
  138. gpr_slice k = grpc_slice_from_static_string("key");
  139. gpr_slice v = grpc_slice_from_static_string("value");
  140. char backing_store[sizeof(grpc_mdelem_data)];
  141. ExecCtx _local_exec_ctx;
  142. while (state.KeepRunning()) {
  143. GRPC_MDELEM_UNREF(grpc_mdelem_create(
  144. k, v, reinterpret_cast<grpc_mdelem_data*>(backing_store)));
  145. }
  146. grpc_exec_ctx_finish();
  147. track_counters.Finish(state);
  148. }
  149. BENCHMARK(BM_MetadataFromNonInternedSlicesWithBackingStore);
  150. static void BM_MetadataFromInternedSlicesWithBackingStore(
  151. benchmark::State& state) {
  152. TrackCounters track_counters;
  153. gpr_slice k = grpc_slice_intern(grpc_slice_from_static_string("key"));
  154. gpr_slice v = grpc_slice_intern(grpc_slice_from_static_string("value"));
  155. char backing_store[sizeof(grpc_mdelem_data)];
  156. ExecCtx _local_exec_ctx;
  157. while (state.KeepRunning()) {
  158. GRPC_MDELEM_UNREF(grpc_mdelem_create(
  159. k, v, reinterpret_cast<grpc_mdelem_data*>(backing_store)));
  160. }
  161. grpc_exec_ctx_finish();
  162. grpc_slice_unref(k);
  163. grpc_slice_unref(v);
  164. track_counters.Finish(state);
  165. }
  166. BENCHMARK(BM_MetadataFromInternedSlicesWithBackingStore);
  167. static void BM_MetadataFromInternedKeyWithBackingStore(
  168. benchmark::State& state) {
  169. TrackCounters track_counters;
  170. gpr_slice k = grpc_slice_intern(grpc_slice_from_static_string("key"));
  171. gpr_slice v = grpc_slice_from_static_string("value");
  172. char backing_store[sizeof(grpc_mdelem_data)];
  173. ExecCtx _local_exec_ctx;
  174. while (state.KeepRunning()) {
  175. GRPC_MDELEM_UNREF(grpc_mdelem_create(
  176. k, v, reinterpret_cast<grpc_mdelem_data*>(backing_store)));
  177. }
  178. grpc_exec_ctx_finish();
  179. grpc_slice_unref(k);
  180. track_counters.Finish(state);
  181. }
  182. BENCHMARK(BM_MetadataFromInternedKeyWithBackingStore);
  183. static void BM_MetadataFromStaticMetadataStrings(benchmark::State& state) {
  184. TrackCounters track_counters;
  185. gpr_slice k = GRPC_MDSTR_STATUS;
  186. gpr_slice v = GRPC_MDSTR_200;
  187. ExecCtx _local_exec_ctx;
  188. while (state.KeepRunning()) {
  189. GRPC_MDELEM_UNREF(grpc_mdelem_create(k, v, NULL));
  190. }
  191. grpc_exec_ctx_finish();
  192. grpc_slice_unref(k);
  193. track_counters.Finish(state);
  194. }
  195. BENCHMARK(BM_MetadataFromStaticMetadataStrings);
  196. static void BM_MetadataFromStaticMetadataStringsNotIndexed(
  197. benchmark::State& state) {
  198. TrackCounters track_counters;
  199. gpr_slice k = GRPC_MDSTR_STATUS;
  200. gpr_slice v = GRPC_MDSTR_GZIP;
  201. ExecCtx _local_exec_ctx;
  202. while (state.KeepRunning()) {
  203. GRPC_MDELEM_UNREF(grpc_mdelem_create(k, v, NULL));
  204. }
  205. grpc_exec_ctx_finish();
  206. grpc_slice_unref(k);
  207. track_counters.Finish(state);
  208. }
  209. BENCHMARK(BM_MetadataFromStaticMetadataStringsNotIndexed);
  210. static void BM_MetadataRefUnrefExternal(benchmark::State& state) {
  211. TrackCounters track_counters;
  212. char backing_store[sizeof(grpc_mdelem_data)];
  213. ExecCtx _local_exec_ctx;
  214. grpc_mdelem el = grpc_mdelem_create(
  215. grpc_slice_from_static_string("a"), grpc_slice_from_static_string("b"),
  216. reinterpret_cast<grpc_mdelem_data*>(backing_store));
  217. while (state.KeepRunning()) {
  218. GRPC_MDELEM_UNREF(GRPC_MDELEM_REF(el));
  219. }
  220. GRPC_MDELEM_UNREF(el);
  221. grpc_exec_ctx_finish();
  222. track_counters.Finish(state);
  223. }
  224. BENCHMARK(BM_MetadataRefUnrefExternal);
  225. static void BM_MetadataRefUnrefInterned(benchmark::State& state) {
  226. TrackCounters track_counters;
  227. char backing_store[sizeof(grpc_mdelem_data)];
  228. ExecCtx _local_exec_ctx;
  229. gpr_slice k = grpc_slice_intern(grpc_slice_from_static_string("key"));
  230. gpr_slice v = grpc_slice_intern(grpc_slice_from_static_string("value"));
  231. grpc_mdelem el = grpc_mdelem_create(
  232. k, v, reinterpret_cast<grpc_mdelem_data*>(backing_store));
  233. grpc_slice_unref(k);
  234. grpc_slice_unref(v);
  235. while (state.KeepRunning()) {
  236. GRPC_MDELEM_UNREF(GRPC_MDELEM_REF(el));
  237. }
  238. GRPC_MDELEM_UNREF(el);
  239. grpc_exec_ctx_finish();
  240. track_counters.Finish(state);
  241. }
  242. BENCHMARK(BM_MetadataRefUnrefInterned);
  243. static void BM_MetadataRefUnrefAllocated(benchmark::State& state) {
  244. TrackCounters track_counters;
  245. ExecCtx _local_exec_ctx;
  246. grpc_mdelem el = grpc_mdelem_create(grpc_slice_from_static_string("a"),
  247. grpc_slice_from_static_string("b"), NULL);
  248. while (state.KeepRunning()) {
  249. GRPC_MDELEM_UNREF(GRPC_MDELEM_REF(el));
  250. }
  251. GRPC_MDELEM_UNREF(el);
  252. grpc_exec_ctx_finish();
  253. track_counters.Finish(state);
  254. }
  255. BENCHMARK(BM_MetadataRefUnrefAllocated);
  256. static void BM_MetadataRefUnrefStatic(benchmark::State& state) {
  257. TrackCounters track_counters;
  258. ExecCtx _local_exec_ctx;
  259. grpc_mdelem el = grpc_mdelem_create(GRPC_MDSTR_STATUS, GRPC_MDSTR_200, NULL);
  260. while (state.KeepRunning()) {
  261. GRPC_MDELEM_UNREF(GRPC_MDELEM_REF(el));
  262. }
  263. GRPC_MDELEM_UNREF(el);
  264. grpc_exec_ctx_finish();
  265. track_counters.Finish(state);
  266. }
  267. BENCHMARK(BM_MetadataRefUnrefStatic);
  268. BENCHMARK_MAIN();