1 /*
2  *
3  * Copyright 2019 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 #include "test/cpp/microbenchmarks/callback_streaming_ping_pong.h"
20 #include "test/cpp/util/test_config.h"
21 
22 namespace grpc {
23 namespace testing {
24 
25 /*******************************************************************************
26  * CONFIGURATIONS
27  */
28 
29 // Replace "benchmark::internal::Benchmark" with "::testing::Benchmark" to use
30 // internal microbenchmarking tooling
StreamingPingPongMsgSizeArgs(benchmark::internal::Benchmark * b)31 static void StreamingPingPongMsgSizeArgs(benchmark::internal::Benchmark* b) {
32   // base case: 0 byte ping-pong msgs
33   b->Args({0, 1});
34   b->Args({0, 2});
35 
36   for (int msg_size = 1; msg_size <= 128 * 1024 * 1024; msg_size *= 8) {
37     b->Args({msg_size, 1});
38     b->Args({msg_size, 2});
39   }
40 }
41 
42 // Replace "benchmark::internal::Benchmark" with "::testing::Benchmark" to use
43 // internal microbenchmarking tooling
StreamingPingPongMsgsNumberArgs(benchmark::internal::Benchmark * b)44 static void StreamingPingPongMsgsNumberArgs(benchmark::internal::Benchmark* b) {
45   for (int msg_number = 1; msg_number <= 256 * 1024; msg_number *= 8) {
46     b->Args({0, msg_number});
47     b->Args({1024, msg_number});
48   }
49 }
50 
51 // Streaming with different message size
52 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess, NoOpMutator,
53                    NoOpMutator)
54     ->Apply(StreamingPingPongMsgSizeArgs);
55 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, MinInProcess, NoOpMutator,
56                    NoOpMutator)
57     ->Apply(StreamingPingPongMsgSizeArgs);
58 
59 // Streaming with different message number
60 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess, NoOpMutator,
61                    NoOpMutator)
62     ->Apply(StreamingPingPongMsgsNumberArgs);
63 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, MinInProcess, NoOpMutator,
64                    NoOpMutator)
65     ->Apply(StreamingPingPongMsgsNumberArgs);
66 
67 // Client context with different metadata
68 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess,
69                    Client_AddMetadata<RandomBinaryMetadata<10>, 1>, NoOpMutator)
70     ->Args({0, 1});
71 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess,
72                    Client_AddMetadata<RandomBinaryMetadata<31>, 1>, NoOpMutator)
73     ->Args({0, 1});
74 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess,
75                    Client_AddMetadata<RandomBinaryMetadata<100>, 1>,
76                    NoOpMutator)
77     ->Args({0, 1});
78 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess,
79                    Client_AddMetadata<RandomBinaryMetadata<10>, 2>, NoOpMutator)
80     ->Args({0, 1});
81 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess,
82                    Client_AddMetadata<RandomBinaryMetadata<31>, 2>, NoOpMutator)
83     ->Args({0, 1});
84 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess,
85                    Client_AddMetadata<RandomBinaryMetadata<100>, 2>,
86                    NoOpMutator)
87     ->Args({0, 1});
88 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess,
89                    Client_AddMetadata<RandomAsciiMetadata<10>, 1>, NoOpMutator)
90     ->Args({0, 1});
91 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess,
92                    Client_AddMetadata<RandomAsciiMetadata<31>, 1>, NoOpMutator)
93     ->Args({0, 1});
94 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess,
95                    Client_AddMetadata<RandomAsciiMetadata<100>, 1>, NoOpMutator)
96     ->Args({0, 1});
97 
98 // Server context with different metadata
99 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess, NoOpMutator,
100                    Server_AddInitialMetadata<RandomBinaryMetadata<10>, 1>)
101     ->Args({0, 1});
102 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess, NoOpMutator,
103                    Server_AddInitialMetadata<RandomBinaryMetadata<31>, 1>)
104     ->Args({0, 1});
105 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess, NoOpMutator,
106                    Server_AddInitialMetadata<RandomBinaryMetadata<100>, 1>)
107     ->Args({0, 1});
108 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess, NoOpMutator,
109                    Server_AddInitialMetadata<RandomAsciiMetadata<10>, 1>)
110     ->Args({0, 1});
111 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess, NoOpMutator,
112                    Server_AddInitialMetadata<RandomAsciiMetadata<31>, 1>)
113     ->Args({0, 1});
114 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess, NoOpMutator,
115                    Server_AddInitialMetadata<RandomAsciiMetadata<100>, 1>)
116     ->Args({0, 1});
117 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess, NoOpMutator,
118                    Server_AddInitialMetadata<RandomAsciiMetadata<10>, 100>)
119     ->Args({0, 1});
120 
121 }  // namespace testing
122 }  // namespace grpc
123 
124 // Some distros have RunSpecifiedBenchmarks under the benchmark namespace,
125 // and others do not. This allows us to support both modes.
126 namespace benchmark {
RunTheBenchmarksNamespaced()127 void RunTheBenchmarksNamespaced() { RunSpecifiedBenchmarks(); }
128 }  // namespace benchmark
129 
main(int argc,char ** argv)130 int main(int argc, char** argv) {
131   LibraryInitializer libInit;
132   ::benchmark::Initialize(&argc, argv);
133   ::grpc::testing::InitTest(&argc, &argv, false);
134   benchmark::RunTheBenchmarksNamespaced();
135   return 0;
136 }
137