xref: /aosp_15_r20/external/perfetto/test/end_to_end_benchmark.cc (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker // Copyright (C) 2018 The Android Open Source Project
2*6dbdd20aSAndroid Build Coastguard Worker //
3*6dbdd20aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*6dbdd20aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*6dbdd20aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*6dbdd20aSAndroid Build Coastguard Worker //
7*6dbdd20aSAndroid Build Coastguard Worker //      http://www.apache.org/licenses/LICENSE-2.0
8*6dbdd20aSAndroid Build Coastguard Worker //
9*6dbdd20aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*6dbdd20aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*6dbdd20aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*6dbdd20aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*6dbdd20aSAndroid Build Coastguard Worker // limitations under the License.
14*6dbdd20aSAndroid Build Coastguard Worker 
15*6dbdd20aSAndroid Build Coastguard Worker #include <random>
16*6dbdd20aSAndroid Build Coastguard Worker 
17*6dbdd20aSAndroid Build Coastguard Worker #include <benchmark/benchmark.h>
18*6dbdd20aSAndroid Build Coastguard Worker 
19*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/base/time.h"
20*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/traced/traced.h"
21*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/tracing/core/trace_packet.h"
22*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/tracing/core/trace_config.h"
23*6dbdd20aSAndroid Build Coastguard Worker #include "src/base/test/test_task_runner.h"
24*6dbdd20aSAndroid Build Coastguard Worker #include "test/gtest_and_gmock.h"
25*6dbdd20aSAndroid Build Coastguard Worker #include "test/test_helper.h"
26*6dbdd20aSAndroid Build Coastguard Worker 
27*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/config/test_config.gen.h"
28*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/trace/test_event.gen.h"
29*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/trace/trace_packet.pbzero.h"
30*6dbdd20aSAndroid Build Coastguard Worker 
31*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto {
32*6dbdd20aSAndroid Build Coastguard Worker 
33*6dbdd20aSAndroid Build Coastguard Worker namespace {
34*6dbdd20aSAndroid Build Coastguard Worker 
IsBenchmarkFunctionalOnly()35*6dbdd20aSAndroid Build Coastguard Worker bool IsBenchmarkFunctionalOnly() {
36*6dbdd20aSAndroid Build Coastguard Worker   return getenv("BENCHMARK_FUNCTIONAL_TEST_ONLY") != nullptr;
37*6dbdd20aSAndroid Build Coastguard Worker }
38*6dbdd20aSAndroid Build Coastguard Worker 
BenchmarkProducer(benchmark::State & state)39*6dbdd20aSAndroid Build Coastguard Worker void BenchmarkProducer(benchmark::State& state) {
40*6dbdd20aSAndroid Build Coastguard Worker   base::TestTaskRunner task_runner;
41*6dbdd20aSAndroid Build Coastguard Worker 
42*6dbdd20aSAndroid Build Coastguard Worker   TestHelper helper(&task_runner);
43*6dbdd20aSAndroid Build Coastguard Worker   helper.StartServiceIfRequired();
44*6dbdd20aSAndroid Build Coastguard Worker 
45*6dbdd20aSAndroid Build Coastguard Worker   FakeProducer* producer = helper.ConnectFakeProducer();
46*6dbdd20aSAndroid Build Coastguard Worker   helper.ConnectConsumer();
47*6dbdd20aSAndroid Build Coastguard Worker   helper.WaitForConsumerConnect();
48*6dbdd20aSAndroid Build Coastguard Worker 
49*6dbdd20aSAndroid Build Coastguard Worker   TraceConfig trace_config;
50*6dbdd20aSAndroid Build Coastguard Worker   trace_config.add_buffers()->set_size_kb(512);
51*6dbdd20aSAndroid Build Coastguard Worker 
52*6dbdd20aSAndroid Build Coastguard Worker   auto* ds_config = trace_config.add_data_sources()->mutable_config();
53*6dbdd20aSAndroid Build Coastguard Worker   ds_config->set_name("android.perfetto.FakeProducer");
54*6dbdd20aSAndroid Build Coastguard Worker   ds_config->set_target_buffer(0);
55*6dbdd20aSAndroid Build Coastguard Worker 
56*6dbdd20aSAndroid Build Coastguard Worker   static constexpr uint32_t kRandomSeed = 42;
57*6dbdd20aSAndroid Build Coastguard Worker   uint32_t message_count = static_cast<uint32_t>(state.range(0));
58*6dbdd20aSAndroid Build Coastguard Worker   uint32_t message_bytes = static_cast<uint32_t>(state.range(1));
59*6dbdd20aSAndroid Build Coastguard Worker   uint32_t mb_per_s = static_cast<uint32_t>(state.range(2));
60*6dbdd20aSAndroid Build Coastguard Worker 
61*6dbdd20aSAndroid Build Coastguard Worker   uint32_t messages_per_s = mb_per_s * 1024 * 1024 / message_bytes;
62*6dbdd20aSAndroid Build Coastguard Worker   uint32_t time_for_messages_ms =
63*6dbdd20aSAndroid Build Coastguard Worker       10000 + (messages_per_s == 0 ? 0 : message_count * 1000 / messages_per_s);
64*6dbdd20aSAndroid Build Coastguard Worker 
65*6dbdd20aSAndroid Build Coastguard Worker   ds_config->mutable_for_testing()->set_seed(kRandomSeed);
66*6dbdd20aSAndroid Build Coastguard Worker   ds_config->mutable_for_testing()->set_message_count(message_count);
67*6dbdd20aSAndroid Build Coastguard Worker   ds_config->mutable_for_testing()->set_message_size(message_bytes);
68*6dbdd20aSAndroid Build Coastguard Worker   ds_config->mutable_for_testing()->set_max_messages_per_second(messages_per_s);
69*6dbdd20aSAndroid Build Coastguard Worker 
70*6dbdd20aSAndroid Build Coastguard Worker   helper.StartTracing(trace_config);
71*6dbdd20aSAndroid Build Coastguard Worker   helper.WaitForProducerEnabled();
72*6dbdd20aSAndroid Build Coastguard Worker 
73*6dbdd20aSAndroid Build Coastguard Worker   uint64_t wall_start_ns = static_cast<uint64_t>(base::GetWallTimeNs().count());
74*6dbdd20aSAndroid Build Coastguard Worker   uint64_t service_start_ns =
75*6dbdd20aSAndroid Build Coastguard Worker       helper.service_thread()->GetThreadCPUTimeNsForTesting();
76*6dbdd20aSAndroid Build Coastguard Worker   uint64_t producer_start_ns =
77*6dbdd20aSAndroid Build Coastguard Worker       helper.producer_thread()->GetThreadCPUTimeNsForTesting();
78*6dbdd20aSAndroid Build Coastguard Worker   uint32_t iterations = 0;
79*6dbdd20aSAndroid Build Coastguard Worker   for (auto _ : state) {
80*6dbdd20aSAndroid Build Coastguard Worker     auto cname = "produced.and.committed." + std::to_string(iterations++);
81*6dbdd20aSAndroid Build Coastguard Worker     auto on_produced_and_committed = task_runner.CreateCheckpoint(cname);
82*6dbdd20aSAndroid Build Coastguard Worker     producer->ProduceEventBatch(helper.WrapTask(on_produced_and_committed));
83*6dbdd20aSAndroid Build Coastguard Worker     task_runner.RunUntilCheckpoint(cname, time_for_messages_ms);
84*6dbdd20aSAndroid Build Coastguard Worker   }
85*6dbdd20aSAndroid Build Coastguard Worker   uint64_t service_ns =
86*6dbdd20aSAndroid Build Coastguard Worker       helper.service_thread()->GetThreadCPUTimeNsForTesting() -
87*6dbdd20aSAndroid Build Coastguard Worker       service_start_ns;
88*6dbdd20aSAndroid Build Coastguard Worker   uint64_t producer_ns =
89*6dbdd20aSAndroid Build Coastguard Worker       helper.producer_thread()->GetThreadCPUTimeNsForTesting() -
90*6dbdd20aSAndroid Build Coastguard Worker       producer_start_ns;
91*6dbdd20aSAndroid Build Coastguard Worker   uint64_t wall_ns =
92*6dbdd20aSAndroid Build Coastguard Worker       static_cast<uint64_t>(base::GetWallTimeNs().count()) - wall_start_ns;
93*6dbdd20aSAndroid Build Coastguard Worker 
94*6dbdd20aSAndroid Build Coastguard Worker   state.counters["Ser CPU"] = benchmark::Counter(
95*6dbdd20aSAndroid Build Coastguard Worker       100.0 * static_cast<double>(service_ns) / static_cast<double>(wall_ns));
96*6dbdd20aSAndroid Build Coastguard Worker   state.counters["Ser ns/m"] = benchmark::Counter(
97*6dbdd20aSAndroid Build Coastguard Worker       static_cast<double>(service_ns) / static_cast<double>(message_count));
98*6dbdd20aSAndroid Build Coastguard Worker   state.counters["Pro CPU"] = benchmark::Counter(
99*6dbdd20aSAndroid Build Coastguard Worker       100.0 * static_cast<double>(producer_ns) / static_cast<double>(wall_ns));
100*6dbdd20aSAndroid Build Coastguard Worker   state.SetBytesProcessed(iterations * message_bytes * message_count);
101*6dbdd20aSAndroid Build Coastguard Worker 
102*6dbdd20aSAndroid Build Coastguard Worker   // Read back the buffer just to check correctness.
103*6dbdd20aSAndroid Build Coastguard Worker   helper.ReadData();
104*6dbdd20aSAndroid Build Coastguard Worker   helper.WaitForReadData();
105*6dbdd20aSAndroid Build Coastguard Worker 
106*6dbdd20aSAndroid Build Coastguard Worker   bool is_first_packet = true;
107*6dbdd20aSAndroid Build Coastguard Worker   std::minstd_rand0 rnd_engine(kRandomSeed);
108*6dbdd20aSAndroid Build Coastguard Worker   for (const auto& packet : helper.trace()) {
109*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_TRUE(packet.has_for_testing());
110*6dbdd20aSAndroid Build Coastguard Worker     if (is_first_packet) {
111*6dbdd20aSAndroid Build Coastguard Worker       rnd_engine = std::minstd_rand0(packet.for_testing().seq_value());
112*6dbdd20aSAndroid Build Coastguard Worker       is_first_packet = false;
113*6dbdd20aSAndroid Build Coastguard Worker     } else {
114*6dbdd20aSAndroid Build Coastguard Worker       ASSERT_EQ(packet.for_testing().seq_value(), rnd_engine());
115*6dbdd20aSAndroid Build Coastguard Worker     }
116*6dbdd20aSAndroid Build Coastguard Worker   }
117*6dbdd20aSAndroid Build Coastguard Worker }
118*6dbdd20aSAndroid Build Coastguard Worker 
BenchmarkConsumer(benchmark::State & state)119*6dbdd20aSAndroid Build Coastguard Worker static void BenchmarkConsumer(benchmark::State& state) {
120*6dbdd20aSAndroid Build Coastguard Worker   base::TestTaskRunner task_runner;
121*6dbdd20aSAndroid Build Coastguard Worker 
122*6dbdd20aSAndroid Build Coastguard Worker   TestHelper helper(&task_runner);
123*6dbdd20aSAndroid Build Coastguard Worker   helper.StartServiceIfRequired();
124*6dbdd20aSAndroid Build Coastguard Worker 
125*6dbdd20aSAndroid Build Coastguard Worker   FakeProducer* producer = helper.ConnectFakeProducer();
126*6dbdd20aSAndroid Build Coastguard Worker   helper.ConnectConsumer();
127*6dbdd20aSAndroid Build Coastguard Worker   helper.WaitForConsumerConnect();
128*6dbdd20aSAndroid Build Coastguard Worker 
129*6dbdd20aSAndroid Build Coastguard Worker   TraceConfig trace_config;
130*6dbdd20aSAndroid Build Coastguard Worker 
131*6dbdd20aSAndroid Build Coastguard Worker   static const uint32_t kBufferSizeBytes =
132*6dbdd20aSAndroid Build Coastguard Worker       IsBenchmarkFunctionalOnly() ? 16 * 1024 : 2 * 1024 * 1024;
133*6dbdd20aSAndroid Build Coastguard Worker   trace_config.add_buffers()->set_size_kb(kBufferSizeBytes / 1024);
134*6dbdd20aSAndroid Build Coastguard Worker 
135*6dbdd20aSAndroid Build Coastguard Worker   static constexpr uint32_t kRandomSeed = 42;
136*6dbdd20aSAndroid Build Coastguard Worker   uint32_t message_bytes = static_cast<uint32_t>(state.range(0));
137*6dbdd20aSAndroid Build Coastguard Worker   uint32_t mb_per_s = static_cast<uint32_t>(state.range(1));
138*6dbdd20aSAndroid Build Coastguard Worker   bool is_saturated_producer = mb_per_s == 0;
139*6dbdd20aSAndroid Build Coastguard Worker 
140*6dbdd20aSAndroid Build Coastguard Worker   uint32_t message_count = kBufferSizeBytes / message_bytes;
141*6dbdd20aSAndroid Build Coastguard Worker   uint32_t messages_per_s = mb_per_s * 1024 * 1024 / message_bytes;
142*6dbdd20aSAndroid Build Coastguard Worker   uint32_t number_of_batches =
143*6dbdd20aSAndroid Build Coastguard Worker       is_saturated_producer ? 0 : std::max(1u, message_count / messages_per_s);
144*6dbdd20aSAndroid Build Coastguard Worker 
145*6dbdd20aSAndroid Build Coastguard Worker   auto* ds_config = trace_config.add_data_sources()->mutable_config();
146*6dbdd20aSAndroid Build Coastguard Worker   ds_config->set_name("android.perfetto.FakeProducer");
147*6dbdd20aSAndroid Build Coastguard Worker   ds_config->set_target_buffer(0);
148*6dbdd20aSAndroid Build Coastguard Worker   ds_config->mutable_for_testing()->set_seed(kRandomSeed);
149*6dbdd20aSAndroid Build Coastguard Worker   ds_config->mutable_for_testing()->set_message_count(message_count);
150*6dbdd20aSAndroid Build Coastguard Worker   ds_config->mutable_for_testing()->set_message_size(message_bytes);
151*6dbdd20aSAndroid Build Coastguard Worker   ds_config->mutable_for_testing()->set_max_messages_per_second(messages_per_s);
152*6dbdd20aSAndroid Build Coastguard Worker 
153*6dbdd20aSAndroid Build Coastguard Worker   helper.StartTracing(trace_config);
154*6dbdd20aSAndroid Build Coastguard Worker   helper.WaitForProducerEnabled();
155*6dbdd20aSAndroid Build Coastguard Worker 
156*6dbdd20aSAndroid Build Coastguard Worker   uint64_t wall_start_ns = static_cast<uint64_t>(base::GetWallTimeNs().count());
157*6dbdd20aSAndroid Build Coastguard Worker   uint64_t service_start_ns = static_cast<uint64_t>(
158*6dbdd20aSAndroid Build Coastguard Worker       helper.service_thread()->GetThreadCPUTimeNsForTesting());
159*6dbdd20aSAndroid Build Coastguard Worker   uint64_t consumer_start_ns =
160*6dbdd20aSAndroid Build Coastguard Worker       static_cast<uint64_t>(base::GetThreadCPUTimeNs().count());
161*6dbdd20aSAndroid Build Coastguard Worker   uint64_t read_time_taken_ns = 0;
162*6dbdd20aSAndroid Build Coastguard Worker 
163*6dbdd20aSAndroid Build Coastguard Worker   uint64_t iterations = 0;
164*6dbdd20aSAndroid Build Coastguard Worker   uint32_t counter = 0;
165*6dbdd20aSAndroid Build Coastguard Worker   for (auto _ : state) {
166*6dbdd20aSAndroid Build Coastguard Worker     auto cname = "produced.and.committed." + std::to_string(iterations++);
167*6dbdd20aSAndroid Build Coastguard Worker     auto on_produced_and_committed = task_runner.CreateCheckpoint(cname);
168*6dbdd20aSAndroid Build Coastguard Worker     producer->ProduceEventBatch(helper.WrapTask(on_produced_and_committed));
169*6dbdd20aSAndroid Build Coastguard Worker 
170*6dbdd20aSAndroid Build Coastguard Worker     if (is_saturated_producer) {
171*6dbdd20aSAndroid Build Coastguard Worker       // If the producer is running in saturated mode, wait until it flushes
172*6dbdd20aSAndroid Build Coastguard Worker       // data.
173*6dbdd20aSAndroid Build Coastguard Worker       task_runner.RunUntilCheckpoint(cname);
174*6dbdd20aSAndroid Build Coastguard Worker 
175*6dbdd20aSAndroid Build Coastguard Worker       // Then time how long it takes to read back the data.
176*6dbdd20aSAndroid Build Coastguard Worker       int64_t start = base::GetWallTimeNs().count();
177*6dbdd20aSAndroid Build Coastguard Worker       helper.ReadData(counter);
178*6dbdd20aSAndroid Build Coastguard Worker       helper.WaitForReadData(counter++);
179*6dbdd20aSAndroid Build Coastguard Worker       read_time_taken_ns +=
180*6dbdd20aSAndroid Build Coastguard Worker           static_cast<uint64_t>(base::GetWallTimeNs().count() - start);
181*6dbdd20aSAndroid Build Coastguard Worker     } else {
182*6dbdd20aSAndroid Build Coastguard Worker       // If the producer is not running in saturated mode, every second the
183*6dbdd20aSAndroid Build Coastguard Worker       // producer will send a batch of data over. Wait for a second before
184*6dbdd20aSAndroid Build Coastguard Worker       // performing readback; do this for each batch the producer sends.
185*6dbdd20aSAndroid Build Coastguard Worker       for (uint32_t i = 0; i < number_of_batches; i++) {
186*6dbdd20aSAndroid Build Coastguard Worker         auto batch_cname = "batch.checkpoint." + std::to_string(counter);
187*6dbdd20aSAndroid Build Coastguard Worker         auto batch_checkpoint = task_runner.CreateCheckpoint(batch_cname);
188*6dbdd20aSAndroid Build Coastguard Worker         task_runner.PostDelayedTask(batch_checkpoint, 1000);
189*6dbdd20aSAndroid Build Coastguard Worker         task_runner.RunUntilCheckpoint(batch_cname);
190*6dbdd20aSAndroid Build Coastguard Worker 
191*6dbdd20aSAndroid Build Coastguard Worker         int64_t start = base::GetWallTimeNs().count();
192*6dbdd20aSAndroid Build Coastguard Worker         helper.ReadData(counter);
193*6dbdd20aSAndroid Build Coastguard Worker         helper.WaitForReadData(counter++);
194*6dbdd20aSAndroid Build Coastguard Worker         read_time_taken_ns +=
195*6dbdd20aSAndroid Build Coastguard Worker             static_cast<uint64_t>(base::GetWallTimeNs().count() - start);
196*6dbdd20aSAndroid Build Coastguard Worker       }
197*6dbdd20aSAndroid Build Coastguard Worker     }
198*6dbdd20aSAndroid Build Coastguard Worker   }
199*6dbdd20aSAndroid Build Coastguard Worker   uint64_t service_ns =
200*6dbdd20aSAndroid Build Coastguard Worker       helper.service_thread()->GetThreadCPUTimeNsForTesting() -
201*6dbdd20aSAndroid Build Coastguard Worker       service_start_ns;
202*6dbdd20aSAndroid Build Coastguard Worker   uint64_t consumer_ns =
203*6dbdd20aSAndroid Build Coastguard Worker       static_cast<uint64_t>(base::GetThreadCPUTimeNs().count()) -
204*6dbdd20aSAndroid Build Coastguard Worker       consumer_start_ns;
205*6dbdd20aSAndroid Build Coastguard Worker   uint64_t wall_ns =
206*6dbdd20aSAndroid Build Coastguard Worker       static_cast<uint64_t>(base::GetWallTimeNs().count()) - wall_start_ns;
207*6dbdd20aSAndroid Build Coastguard Worker 
208*6dbdd20aSAndroid Build Coastguard Worker   state.counters["Ser CPU"] = benchmark::Counter(
209*6dbdd20aSAndroid Build Coastguard Worker       100.0 * static_cast<double>(service_ns) / static_cast<double>(wall_ns));
210*6dbdd20aSAndroid Build Coastguard Worker   state.counters["Ser ns/m"] =
211*6dbdd20aSAndroid Build Coastguard Worker       benchmark::Counter(1.0 * static_cast<double>(service_ns) /
212*6dbdd20aSAndroid Build Coastguard Worker                          static_cast<double>(message_count));
213*6dbdd20aSAndroid Build Coastguard Worker   state.counters["Con CPU"] = benchmark::Counter(
214*6dbdd20aSAndroid Build Coastguard Worker       100.0 * static_cast<double>(consumer_ns) / static_cast<double>(wall_ns));
215*6dbdd20aSAndroid Build Coastguard Worker   state.counters["Con Speed"] =
216*6dbdd20aSAndroid Build Coastguard Worker       benchmark::Counter(static_cast<double>(iterations) * 1000.0 * 1000.0 *
217*6dbdd20aSAndroid Build Coastguard Worker                          1000.0 * static_cast<double>(kBufferSizeBytes) /
218*6dbdd20aSAndroid Build Coastguard Worker                          static_cast<double>(read_time_taken_ns));
219*6dbdd20aSAndroid Build Coastguard Worker }
220*6dbdd20aSAndroid Build Coastguard Worker 
SaturateCpuProducerArgs(benchmark::internal::Benchmark * b)221*6dbdd20aSAndroid Build Coastguard Worker void SaturateCpuProducerArgs(benchmark::internal::Benchmark* b) {
222*6dbdd20aSAndroid Build Coastguard Worker   int min_message_count = 16;
223*6dbdd20aSAndroid Build Coastguard Worker   int max_message_count = IsBenchmarkFunctionalOnly() ? 16 : 1024 * 1024;
224*6dbdd20aSAndroid Build Coastguard Worker   int min_payload = 8;
225*6dbdd20aSAndroid Build Coastguard Worker   int max_payload = IsBenchmarkFunctionalOnly() ? 8 : 2048;
226*6dbdd20aSAndroid Build Coastguard Worker   for (int count = min_message_count; count <= max_message_count; count *= 2) {
227*6dbdd20aSAndroid Build Coastguard Worker     for (int bytes = min_payload; bytes <= max_payload; bytes *= 2) {
228*6dbdd20aSAndroid Build Coastguard Worker       b->Args({count, bytes, 0 /* speed */});
229*6dbdd20aSAndroid Build Coastguard Worker     }
230*6dbdd20aSAndroid Build Coastguard Worker   }
231*6dbdd20aSAndroid Build Coastguard Worker }
232*6dbdd20aSAndroid Build Coastguard Worker 
ConstantRateProducerArgs(benchmark::internal::Benchmark * b)233*6dbdd20aSAndroid Build Coastguard Worker void ConstantRateProducerArgs(benchmark::internal::Benchmark* b) {
234*6dbdd20aSAndroid Build Coastguard Worker   int message_count = IsBenchmarkFunctionalOnly() ? 2 * 1024 : 128 * 1024;
235*6dbdd20aSAndroid Build Coastguard Worker   int min_speed = IsBenchmarkFunctionalOnly() ? 128 : 8;
236*6dbdd20aSAndroid Build Coastguard Worker   int max_speed = 128;
237*6dbdd20aSAndroid Build Coastguard Worker   for (int speed = min_speed; speed <= max_speed; speed *= 2) {
238*6dbdd20aSAndroid Build Coastguard Worker     b->Args({message_count, 128, speed});
239*6dbdd20aSAndroid Build Coastguard Worker     b->Args({message_count, 256, speed});
240*6dbdd20aSAndroid Build Coastguard Worker   }
241*6dbdd20aSAndroid Build Coastguard Worker }
242*6dbdd20aSAndroid Build Coastguard Worker 
SaturateCpuConsumerArgs(benchmark::internal::Benchmark * b)243*6dbdd20aSAndroid Build Coastguard Worker void SaturateCpuConsumerArgs(benchmark::internal::Benchmark* b) {
244*6dbdd20aSAndroid Build Coastguard Worker   int min_payload = 8;
245*6dbdd20aSAndroid Build Coastguard Worker   int max_payload = IsBenchmarkFunctionalOnly() ? 8 : 64 * 1024;
246*6dbdd20aSAndroid Build Coastguard Worker   for (int bytes = min_payload; bytes <= max_payload; bytes *= 2) {
247*6dbdd20aSAndroid Build Coastguard Worker     b->Args({bytes, 0 /* speed */});
248*6dbdd20aSAndroid Build Coastguard Worker   }
249*6dbdd20aSAndroid Build Coastguard Worker }
250*6dbdd20aSAndroid Build Coastguard Worker 
ConstantRateConsumerArgs(benchmark::internal::Benchmark * b)251*6dbdd20aSAndroid Build Coastguard Worker void ConstantRateConsumerArgs(benchmark::internal::Benchmark* b) {
252*6dbdd20aSAndroid Build Coastguard Worker   int min_speed = IsBenchmarkFunctionalOnly() ? 128 : 1;
253*6dbdd20aSAndroid Build Coastguard Worker   int max_speed = IsBenchmarkFunctionalOnly() ? 128 : 2;
254*6dbdd20aSAndroid Build Coastguard Worker   for (int speed = min_speed; speed <= max_speed; speed *= 2) {
255*6dbdd20aSAndroid Build Coastguard Worker     b->Args({2, speed});
256*6dbdd20aSAndroid Build Coastguard Worker     b->Args({4, speed});
257*6dbdd20aSAndroid Build Coastguard Worker   }
258*6dbdd20aSAndroid Build Coastguard Worker }
259*6dbdd20aSAndroid Build Coastguard Worker 
260*6dbdd20aSAndroid Build Coastguard Worker }  // namespace
261*6dbdd20aSAndroid Build Coastguard Worker 
BM_EndToEnd_Producer_SaturateCpu(benchmark::State & state)262*6dbdd20aSAndroid Build Coastguard Worker static void BM_EndToEnd_Producer_SaturateCpu(benchmark::State& state) {
263*6dbdd20aSAndroid Build Coastguard Worker   BenchmarkProducer(state);
264*6dbdd20aSAndroid Build Coastguard Worker }
265*6dbdd20aSAndroid Build Coastguard Worker 
266*6dbdd20aSAndroid Build Coastguard Worker BENCHMARK(BM_EndToEnd_Producer_SaturateCpu)
267*6dbdd20aSAndroid Build Coastguard Worker     ->Unit(benchmark::kMicrosecond)
268*6dbdd20aSAndroid Build Coastguard Worker     ->UseRealTime()
269*6dbdd20aSAndroid Build Coastguard Worker     ->Apply(SaturateCpuProducerArgs);
270*6dbdd20aSAndroid Build Coastguard Worker 
BM_EndToEnd_Producer_ConstantRate(benchmark::State & state)271*6dbdd20aSAndroid Build Coastguard Worker static void BM_EndToEnd_Producer_ConstantRate(benchmark::State& state) {
272*6dbdd20aSAndroid Build Coastguard Worker   BenchmarkProducer(state);
273*6dbdd20aSAndroid Build Coastguard Worker }
274*6dbdd20aSAndroid Build Coastguard Worker 
275*6dbdd20aSAndroid Build Coastguard Worker BENCHMARK(BM_EndToEnd_Producer_ConstantRate)
276*6dbdd20aSAndroid Build Coastguard Worker     ->Unit(benchmark::kMicrosecond)
277*6dbdd20aSAndroid Build Coastguard Worker     ->UseRealTime()
278*6dbdd20aSAndroid Build Coastguard Worker     ->Apply(ConstantRateProducerArgs);
279*6dbdd20aSAndroid Build Coastguard Worker 
BM_EndToEnd_Consumer_SaturateCpu(benchmark::State & state)280*6dbdd20aSAndroid Build Coastguard Worker static void BM_EndToEnd_Consumer_SaturateCpu(benchmark::State& state) {
281*6dbdd20aSAndroid Build Coastguard Worker   BenchmarkConsumer(state);
282*6dbdd20aSAndroid Build Coastguard Worker }
283*6dbdd20aSAndroid Build Coastguard Worker 
284*6dbdd20aSAndroid Build Coastguard Worker BENCHMARK(BM_EndToEnd_Consumer_SaturateCpu)
285*6dbdd20aSAndroid Build Coastguard Worker     ->Unit(benchmark::kMicrosecond)
286*6dbdd20aSAndroid Build Coastguard Worker     ->UseRealTime()
287*6dbdd20aSAndroid Build Coastguard Worker     ->Apply(SaturateCpuConsumerArgs);
288*6dbdd20aSAndroid Build Coastguard Worker 
BM_EndToEnd_Consumer_ConstantRate(benchmark::State & state)289*6dbdd20aSAndroid Build Coastguard Worker static void BM_EndToEnd_Consumer_ConstantRate(benchmark::State& state) {
290*6dbdd20aSAndroid Build Coastguard Worker   BenchmarkConsumer(state);
291*6dbdd20aSAndroid Build Coastguard Worker }
292*6dbdd20aSAndroid Build Coastguard Worker 
293*6dbdd20aSAndroid Build Coastguard Worker BENCHMARK(BM_EndToEnd_Consumer_ConstantRate)
294*6dbdd20aSAndroid Build Coastguard Worker     ->Unit(benchmark::kMillisecond)
295*6dbdd20aSAndroid Build Coastguard Worker     ->UseRealTime()
296*6dbdd20aSAndroid Build Coastguard Worker     ->Apply(ConstantRateConsumerArgs);
297*6dbdd20aSAndroid Build Coastguard Worker 
298*6dbdd20aSAndroid Build Coastguard Worker }  // namespace perfetto
299