Imported Upstream version 1.21.0
[platform/upstream/grpc.git] / test / cpp / microbenchmarks / bm_byte_buffer.cc
1 /*
2  *
3  * Copyright 2015 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
19 /* This benchmark exists to show that byte-buffer copy is size-independent */
20
21 #include <memory>
22
23 #include <benchmark/benchmark.h>
24 #include <grpcpp/impl/grpc_library.h>
25 #include <grpcpp/support/byte_buffer.h>
26 #include "test/cpp/microbenchmarks/helpers.h"
27 #include "test/cpp/util/test_config.h"
28
29 namespace grpc {
30 namespace testing {
31
32 static void BM_ByteBuffer_Copy(benchmark::State& state) {
33   int num_slices = state.range(0);
34   size_t slice_size = state.range(1);
35   std::vector<grpc::Slice> slices;
36   while (num_slices > 0) {
37     num_slices--;
38     std::unique_ptr<char[]> buf(new char[slice_size]);
39     memset(buf.get(), 0, slice_size);
40     slices.emplace_back(buf.get(), slice_size);
41   }
42   grpc::ByteBuffer bb(slices.data(), num_slices);
43   while (state.KeepRunning()) {
44     grpc::ByteBuffer cc(bb);
45   }
46 }
47 BENCHMARK(BM_ByteBuffer_Copy)->Ranges({{1, 64}, {1, 1024 * 1024}});
48
49 static void BM_ByteBufferReader_Next(benchmark::State& state) {
50   const int num_slices = state.range(0);
51   constexpr size_t kSliceSize = 16;
52   std::vector<grpc_slice> slices;
53   for (int i = 0; i < num_slices; ++i) {
54     std::unique_ptr<char[]> buf(new char[kSliceSize]);
55     slices.emplace_back(g_core_codegen_interface->grpc_slice_from_copied_buffer(
56         buf.get(), kSliceSize));
57   }
58   grpc_byte_buffer* bb = g_core_codegen_interface->grpc_raw_byte_buffer_create(
59       slices.data(), num_slices);
60   grpc_byte_buffer_reader reader;
61   GPR_ASSERT(
62       g_core_codegen_interface->grpc_byte_buffer_reader_init(&reader, bb));
63   while (state.KeepRunning()) {
64     grpc_slice* slice;
65     if (GPR_UNLIKELY(!g_core_codegen_interface->grpc_byte_buffer_reader_peek(
66             &reader, &slice))) {
67       g_core_codegen_interface->grpc_byte_buffer_reader_destroy(&reader);
68       GPR_ASSERT(
69           g_core_codegen_interface->grpc_byte_buffer_reader_init(&reader, bb));
70       continue;
71     }
72   }
73
74   g_core_codegen_interface->grpc_byte_buffer_reader_destroy(&reader);
75   g_core_codegen_interface->grpc_byte_buffer_destroy(bb);
76   for (auto& slice : slices) {
77     g_core_codegen_interface->grpc_slice_unref(slice);
78   }
79 }
80 BENCHMARK(BM_ByteBufferReader_Next)->Ranges({{64 * 1024, 1024 * 1024}});
81
82 static void BM_ByteBufferReader_Peek(benchmark::State& state) {
83   const int num_slices = state.range(0);
84   constexpr size_t kSliceSize = 16;
85   std::vector<grpc_slice> slices;
86   for (int i = 0; i < num_slices; ++i) {
87     std::unique_ptr<char[]> buf(new char[kSliceSize]);
88     slices.emplace_back(g_core_codegen_interface->grpc_slice_from_copied_buffer(
89         buf.get(), kSliceSize));
90   }
91   grpc_byte_buffer* bb = g_core_codegen_interface->grpc_raw_byte_buffer_create(
92       slices.data(), num_slices);
93   grpc_byte_buffer_reader reader;
94   GPR_ASSERT(
95       g_core_codegen_interface->grpc_byte_buffer_reader_init(&reader, bb));
96   while (state.KeepRunning()) {
97     grpc_slice* slice;
98     if (GPR_UNLIKELY(!g_core_codegen_interface->grpc_byte_buffer_reader_peek(
99             &reader, &slice))) {
100       g_core_codegen_interface->grpc_byte_buffer_reader_destroy(&reader);
101       GPR_ASSERT(
102           g_core_codegen_interface->grpc_byte_buffer_reader_init(&reader, bb));
103       continue;
104     }
105   }
106
107   g_core_codegen_interface->grpc_byte_buffer_reader_destroy(&reader);
108   g_core_codegen_interface->grpc_byte_buffer_destroy(bb);
109   for (auto& slice : slices) {
110     g_core_codegen_interface->grpc_slice_unref(slice);
111   }
112 }
113 BENCHMARK(BM_ByteBufferReader_Peek)->Ranges({{64 * 1024, 1024 * 1024}});
114
115 }  // namespace testing
116 }  // namespace grpc
117
118 // Some distros have RunSpecifiedBenchmarks under the benchmark namespace,
119 // and others do not. This allows us to support both modes.
120 namespace benchmark {
121 void RunTheBenchmarksNamespaced() { RunSpecifiedBenchmarks(); }
122 }  // namespace benchmark
123
124 int main(int argc, char** argv) {
125   LibraryInitializer libInit;
126   ::benchmark::Initialize(&argc, argv);
127   ::grpc::testing::InitTest(&argc, &argv, false);
128   benchmark::RunTheBenchmarksNamespaced();
129   return 0;
130 }