• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/core/test_util/build.h"
20 #include "test/core/test_util/test_config.h"
21 #include "test/cpp/microbenchmarks/callback_streaming_ping_pong.h"
22 #include "test/cpp/util/test_config.h"
23 
24 namespace grpc {
25 namespace testing {
26 
27 //******************************************************************************
28 // CONFIGURATIONS
29 //
30 
__anon5a58cd7f0102null31 static const int kMaxMessageSize = [] {
32   if (BuiltUnderMsan() || BuiltUnderTsan() || BuiltUnderUbsan()) {
33     // Scale down sizes for intensive benchmarks to avoid timeouts.
34     return 8 * 1024 * 1024;
35   }
36   return 128 * 1024 * 1024;
37 }();
38 
39 // Generate Args for StreamingPingPong benchmarks. Currently generates args for
40 // only "small streams" (i.e streams with 0, 1 or 2 messages)
StreamingPingPongArgs(benchmark::internal::Benchmark * b)41 static void StreamingPingPongArgs(benchmark::internal::Benchmark* b) {
42   int msg_size = 0;
43 
44   b->Args({0, 0});  // spl case: 0 ping-pong msgs (msg_size doesn't matter here)
45 
46   for (msg_size = 0; msg_size <= kMaxMessageSize;
47        msg_size == 0 ? msg_size++ : msg_size *= 8) {
48     b->Args({msg_size, 1});
49     b->Args({msg_size, 2});
50     b->MeasureProcessCPUTime()->UseRealTime();
51   }
52 }
53 
54 // Streaming with different message size
55 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess, NoOpMutator,
56                    NoOpMutator)
57     ->Apply(StreamingPingPongArgs);
58 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, MinInProcess, NoOpMutator,
59                    NoOpMutator)
60     ->Apply(StreamingPingPongArgs);
61 
62 // Client context with different metadata
63 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess,
64                    Client_AddMetadata<RandomBinaryMetadata<10>, 1>, NoOpMutator)
65     ->Args({0, 1});
66 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess,
67                    Client_AddMetadata<RandomBinaryMetadata<31>, 1>, NoOpMutator)
68     ->Args({0, 1});
69 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess,
70                    Client_AddMetadata<RandomBinaryMetadata<100>, 1>,
71                    NoOpMutator)
72     ->Args({0, 1});
73 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess,
74                    Client_AddMetadata<RandomBinaryMetadata<10>, 2>, NoOpMutator)
75     ->Args({0, 1});
76 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess,
77                    Client_AddMetadata<RandomBinaryMetadata<31>, 2>, NoOpMutator)
78     ->Args({0, 1});
79 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess,
80                    Client_AddMetadata<RandomBinaryMetadata<100>, 2>,
81                    NoOpMutator)
82     ->Args({0, 1});
83 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess,
84                    Client_AddMetadata<RandomAsciiMetadata<10>, 1>, NoOpMutator)
85     ->Args({0, 1});
86 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess,
87                    Client_AddMetadata<RandomAsciiMetadata<31>, 1>, NoOpMutator)
88     ->Args({0, 1});
89 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess,
90                    Client_AddMetadata<RandomAsciiMetadata<100>, 1>, NoOpMutator)
91     ->Args({0, 1});
92 
93 // Server context with different metadata
94 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess, NoOpMutator,
95                    Server_AddInitialMetadata<RandomBinaryMetadata<10>, 1>)
96     ->Args({0, 1});
97 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess, NoOpMutator,
98                    Server_AddInitialMetadata<RandomBinaryMetadata<31>, 1>)
99     ->Args({0, 1});
100 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess, NoOpMutator,
101                    Server_AddInitialMetadata<RandomBinaryMetadata<100>, 1>)
102     ->Args({0, 1});
103 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess, NoOpMutator,
104                    Server_AddInitialMetadata<RandomAsciiMetadata<10>, 1>)
105     ->Args({0, 1});
106 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess, NoOpMutator,
107                    Server_AddInitialMetadata<RandomAsciiMetadata<31>, 1>)
108     ->Args({0, 1});
109 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess, NoOpMutator,
110                    Server_AddInitialMetadata<RandomAsciiMetadata<100>, 1>)
111     ->Args({0, 1});
112 BENCHMARK_TEMPLATE(BM_CallbackBidiStreaming, InProcess, NoOpMutator,
113                    Server_AddInitialMetadata<RandomAsciiMetadata<10>, 100>)
114     ->Args({0, 1});
115 
116 }  // namespace testing
117 }  // namespace grpc
118 
119 // Some distros have RunSpecifiedBenchmarks under the benchmark namespace,
120 // and others do not. This allows us to support both modes.
121 namespace benchmark {
RunTheBenchmarksNamespaced()122 void RunTheBenchmarksNamespaced() { RunSpecifiedBenchmarks(); }
123 }  // namespace benchmark
124 
main(int argc,char ** argv)125 int main(int argc, char** argv) {
126   grpc::testing::TestEnvironment env(&argc, argv);
127   LibraryInitializer libInit;
128   ::benchmark::Initialize(&argc, argv);
129   grpc::testing::InitTest(&argc, &argv, false);
130   benchmark::RunTheBenchmarksNamespaced();
131   return 0;
132 }
133