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