xref: /aosp_15_r20/external/perfetto/src/shared_lib/test/benchmark.cc (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker /*
2*6dbdd20aSAndroid Build Coastguard Worker  * Copyright (C) 2023 The Android Open Source Project
3*6dbdd20aSAndroid Build Coastguard Worker  *
4*6dbdd20aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*6dbdd20aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*6dbdd20aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*6dbdd20aSAndroid Build Coastguard Worker  *
8*6dbdd20aSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*6dbdd20aSAndroid Build Coastguard Worker  *
10*6dbdd20aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*6dbdd20aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*6dbdd20aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6dbdd20aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*6dbdd20aSAndroid Build Coastguard Worker  * limitations under the License.
15*6dbdd20aSAndroid Build Coastguard Worker  */
16*6dbdd20aSAndroid Build Coastguard Worker 
17*6dbdd20aSAndroid Build Coastguard Worker #include <stdio.h>
18*6dbdd20aSAndroid Build Coastguard Worker #include <stdlib.h>
19*6dbdd20aSAndroid Build Coastguard Worker #include <unistd.h>
20*6dbdd20aSAndroid Build Coastguard Worker 
21*6dbdd20aSAndroid Build Coastguard Worker #include <memory>
22*6dbdd20aSAndroid Build Coastguard Worker 
23*6dbdd20aSAndroid Build Coastguard Worker #include <benchmark/benchmark.h>
24*6dbdd20aSAndroid Build Coastguard Worker 
25*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/public/abi/atomic.h"
26*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/public/data_source.h"
27*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/public/pb_utils.h"
28*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/public/producer.h"
29*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/public/protos/trace/test_event.pzc.h"
30*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/public/protos/trace/trace.pzc.h"
31*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/public/protos/trace/trace_packet.pzc.h"
32*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/public/protos/trace/track_event/debug_annotation.pzc.h"
33*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/public/protos/trace/track_event/track_event.pzc.h"
34*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/public/te_category_macros.h"
35*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/public/te_macros.h"
36*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/public/track_event.h"
37*6dbdd20aSAndroid Build Coastguard Worker 
38*6dbdd20aSAndroid Build Coastguard Worker #include "src/shared_lib/test/utils.h"
39*6dbdd20aSAndroid Build Coastguard Worker 
40*6dbdd20aSAndroid Build Coastguard Worker static struct PerfettoDs custom = PERFETTO_DS_INIT();
41*6dbdd20aSAndroid Build Coastguard Worker 
42*6dbdd20aSAndroid Build Coastguard Worker #define BENCHMARK_CATEGORIES(C) C(benchmark_cat, "benchmark", "")
43*6dbdd20aSAndroid Build Coastguard Worker 
44*6dbdd20aSAndroid Build Coastguard Worker PERFETTO_TE_CATEGORIES_DEFINE(BENCHMARK_CATEGORIES)
45*6dbdd20aSAndroid Build Coastguard Worker 
46*6dbdd20aSAndroid Build Coastguard Worker namespace {
47*6dbdd20aSAndroid Build Coastguard Worker 
48*6dbdd20aSAndroid Build Coastguard Worker using ::perfetto::shlib::test_utils::FieldView;
49*6dbdd20aSAndroid Build Coastguard Worker using ::perfetto::shlib::test_utils::IdFieldView;
50*6dbdd20aSAndroid Build Coastguard Worker using ::perfetto::shlib::test_utils::TracingSession;
51*6dbdd20aSAndroid Build Coastguard Worker 
52*6dbdd20aSAndroid Build Coastguard Worker constexpr char kDataSourceName[] = "com.example.custom_data_source";
53*6dbdd20aSAndroid Build Coastguard Worker 
Initialize()54*6dbdd20aSAndroid Build Coastguard Worker bool Initialize() {
55*6dbdd20aSAndroid Build Coastguard Worker   struct PerfettoProducerInitArgs args = PERFETTO_PRODUCER_INIT_ARGS_INIT();
56*6dbdd20aSAndroid Build Coastguard Worker   args.backends = PERFETTO_BACKEND_IN_PROCESS;
57*6dbdd20aSAndroid Build Coastguard Worker   PerfettoProducerInit(args);
58*6dbdd20aSAndroid Build Coastguard Worker   PerfettoDsRegister(&custom, kDataSourceName, PerfettoDsParamsDefault());
59*6dbdd20aSAndroid Build Coastguard Worker   PerfettoTeInit();
60*6dbdd20aSAndroid Build Coastguard Worker   PERFETTO_TE_REGISTER_CATEGORIES(BENCHMARK_CATEGORIES);
61*6dbdd20aSAndroid Build Coastguard Worker   return true;
62*6dbdd20aSAndroid Build Coastguard Worker }
63*6dbdd20aSAndroid Build Coastguard Worker 
EnsureInitialized()64*6dbdd20aSAndroid Build Coastguard Worker void EnsureInitialized() {
65*6dbdd20aSAndroid Build Coastguard Worker   static bool initialized = Initialize();
66*6dbdd20aSAndroid Build Coastguard Worker   (void)initialized;
67*6dbdd20aSAndroid Build Coastguard Worker }
68*6dbdd20aSAndroid Build Coastguard Worker 
DecodePacketSizes(const std::vector<uint8_t> & data)69*6dbdd20aSAndroid Build Coastguard Worker size_t DecodePacketSizes(const std::vector<uint8_t>& data) {
70*6dbdd20aSAndroid Build Coastguard Worker   for (struct PerfettoPbDecoderField field :
71*6dbdd20aSAndroid Build Coastguard Worker        IdFieldView(data, perfetto_protos_Trace_packet_field_number)) {
72*6dbdd20aSAndroid Build Coastguard Worker     if (field.status != PERFETTO_PB_DECODER_OK ||
73*6dbdd20aSAndroid Build Coastguard Worker         field.wire_type != PERFETTO_PB_WIRE_TYPE_DELIMITED) {
74*6dbdd20aSAndroid Build Coastguard Worker       abort();
75*6dbdd20aSAndroid Build Coastguard Worker     }
76*6dbdd20aSAndroid Build Coastguard Worker     IdFieldView for_testing_fields(
77*6dbdd20aSAndroid Build Coastguard Worker         field, perfetto_protos_TracePacket_for_testing_field_number);
78*6dbdd20aSAndroid Build Coastguard Worker     if (!for_testing_fields.ok()) {
79*6dbdd20aSAndroid Build Coastguard Worker       abort();
80*6dbdd20aSAndroid Build Coastguard Worker     }
81*6dbdd20aSAndroid Build Coastguard Worker     if (for_testing_fields.size() == 0) {
82*6dbdd20aSAndroid Build Coastguard Worker       continue;
83*6dbdd20aSAndroid Build Coastguard Worker     }
84*6dbdd20aSAndroid Build Coastguard Worker     if (for_testing_fields.size() > 1 || for_testing_fields.front().wire_type !=
85*6dbdd20aSAndroid Build Coastguard Worker                                              PERFETTO_PB_WIRE_TYPE_DELIMITED) {
86*6dbdd20aSAndroid Build Coastguard Worker       abort();
87*6dbdd20aSAndroid Build Coastguard Worker     }
88*6dbdd20aSAndroid Build Coastguard Worker     return field.value.delimited.len;
89*6dbdd20aSAndroid Build Coastguard Worker   }
90*6dbdd20aSAndroid Build Coastguard Worker 
91*6dbdd20aSAndroid Build Coastguard Worker   return 0;
92*6dbdd20aSAndroid Build Coastguard Worker }
93*6dbdd20aSAndroid Build Coastguard Worker 
BM_Shlib_DataSource_Disabled(benchmark::State & state)94*6dbdd20aSAndroid Build Coastguard Worker void BM_Shlib_DataSource_Disabled(benchmark::State& state) {
95*6dbdd20aSAndroid Build Coastguard Worker   EnsureInitialized();
96*6dbdd20aSAndroid Build Coastguard Worker   for (auto _ : state) {
97*6dbdd20aSAndroid Build Coastguard Worker     PERFETTO_DS_TRACE(custom, ctx) {}
98*6dbdd20aSAndroid Build Coastguard Worker     benchmark::ClobberMemory();
99*6dbdd20aSAndroid Build Coastguard Worker   }
100*6dbdd20aSAndroid Build Coastguard Worker }
101*6dbdd20aSAndroid Build Coastguard Worker 
BM_Shlib_DataSource_DifferentPacketSize(benchmark::State & state)102*6dbdd20aSAndroid Build Coastguard Worker void BM_Shlib_DataSource_DifferentPacketSize(benchmark::State& state) {
103*6dbdd20aSAndroid Build Coastguard Worker   EnsureInitialized();
104*6dbdd20aSAndroid Build Coastguard Worker   TracingSession tracing_session =
105*6dbdd20aSAndroid Build Coastguard Worker       TracingSession::Builder().set_data_source_name(kDataSourceName).Build();
106*6dbdd20aSAndroid Build Coastguard Worker 
107*6dbdd20aSAndroid Build Coastguard Worker   // This controls the number of times a field is added in the trace packet.
108*6dbdd20aSAndroid Build Coastguard Worker   // It controls the size of the trace packet. The PacketSize counter reports
109*6dbdd20aSAndroid Build Coastguard Worker   // the exact number.
110*6dbdd20aSAndroid Build Coastguard Worker   const size_t kNumFields = static_cast<size_t>(state.range(0));
111*6dbdd20aSAndroid Build Coastguard Worker 
112*6dbdd20aSAndroid Build Coastguard Worker   for (auto _ : state) {
113*6dbdd20aSAndroid Build Coastguard Worker     PERFETTO_DS_TRACE(custom, ctx) {
114*6dbdd20aSAndroid Build Coastguard Worker       struct PerfettoDsRootTracePacket trace_packet;
115*6dbdd20aSAndroid Build Coastguard Worker       PerfettoDsTracerPacketBegin(&ctx, &trace_packet);
116*6dbdd20aSAndroid Build Coastguard Worker 
117*6dbdd20aSAndroid Build Coastguard Worker       {
118*6dbdd20aSAndroid Build Coastguard Worker         struct perfetto_protos_TestEvent for_testing;
119*6dbdd20aSAndroid Build Coastguard Worker         perfetto_protos_TracePacket_begin_for_testing(&trace_packet.msg,
120*6dbdd20aSAndroid Build Coastguard Worker                                                       &for_testing);
121*6dbdd20aSAndroid Build Coastguard Worker         {
122*6dbdd20aSAndroid Build Coastguard Worker           struct perfetto_protos_TestEvent_TestPayload payload;
123*6dbdd20aSAndroid Build Coastguard Worker           perfetto_protos_TestEvent_begin_payload(&for_testing, &payload);
124*6dbdd20aSAndroid Build Coastguard Worker           for (size_t i = 0; i < kNumFields; i++) {
125*6dbdd20aSAndroid Build Coastguard Worker             perfetto_protos_TestEvent_TestPayload_set_cstr_str(&payload,
126*6dbdd20aSAndroid Build Coastguard Worker                                                                "ABCDEFGH");
127*6dbdd20aSAndroid Build Coastguard Worker           }
128*6dbdd20aSAndroid Build Coastguard Worker           perfetto_protos_TestEvent_end_payload(&for_testing, &payload);
129*6dbdd20aSAndroid Build Coastguard Worker         }
130*6dbdd20aSAndroid Build Coastguard Worker         perfetto_protos_TracePacket_end_for_testing(&trace_packet.msg,
131*6dbdd20aSAndroid Build Coastguard Worker                                                     &for_testing);
132*6dbdd20aSAndroid Build Coastguard Worker       }
133*6dbdd20aSAndroid Build Coastguard Worker       PerfettoDsTracerPacketEnd(&ctx, &trace_packet);
134*6dbdd20aSAndroid Build Coastguard Worker     }
135*6dbdd20aSAndroid Build Coastguard Worker     benchmark::ClobberMemory();
136*6dbdd20aSAndroid Build Coastguard Worker   }
137*6dbdd20aSAndroid Build Coastguard Worker 
138*6dbdd20aSAndroid Build Coastguard Worker   tracing_session.StopBlocking();
139*6dbdd20aSAndroid Build Coastguard Worker   std::vector<uint8_t> data = tracing_session.ReadBlocking();
140*6dbdd20aSAndroid Build Coastguard Worker 
141*6dbdd20aSAndroid Build Coastguard Worker   // Just compute the PacketSize counter.
142*6dbdd20aSAndroid Build Coastguard Worker   state.counters["PacketSize"] = static_cast<double>(DecodePacketSizes(data));
143*6dbdd20aSAndroid Build Coastguard Worker }
144*6dbdd20aSAndroid Build Coastguard Worker 
BM_Shlib_TeDisabled(benchmark::State & state)145*6dbdd20aSAndroid Build Coastguard Worker void BM_Shlib_TeDisabled(benchmark::State& state) {
146*6dbdd20aSAndroid Build Coastguard Worker   EnsureInitialized();
147*6dbdd20aSAndroid Build Coastguard Worker   while (state.KeepRunning()) {
148*6dbdd20aSAndroid Build Coastguard Worker     PERFETTO_TE(benchmark_cat, PERFETTO_TE_SLICE_BEGIN("DisabledEvent"));
149*6dbdd20aSAndroid Build Coastguard Worker     benchmark::ClobberMemory();
150*6dbdd20aSAndroid Build Coastguard Worker   }
151*6dbdd20aSAndroid Build Coastguard Worker }
152*6dbdd20aSAndroid Build Coastguard Worker 
BM_Shlib_TeBasic(benchmark::State & state)153*6dbdd20aSAndroid Build Coastguard Worker void BM_Shlib_TeBasic(benchmark::State& state) {
154*6dbdd20aSAndroid Build Coastguard Worker   EnsureInitialized();
155*6dbdd20aSAndroid Build Coastguard Worker   TracingSession tracing_session = TracingSession::Builder()
156*6dbdd20aSAndroid Build Coastguard Worker                                        .set_data_source_name("track_event")
157*6dbdd20aSAndroid Build Coastguard Worker                                        .add_enabled_category("*")
158*6dbdd20aSAndroid Build Coastguard Worker                                        .Build();
159*6dbdd20aSAndroid Build Coastguard Worker 
160*6dbdd20aSAndroid Build Coastguard Worker   while (state.KeepRunning()) {
161*6dbdd20aSAndroid Build Coastguard Worker     PERFETTO_TE(benchmark_cat, PERFETTO_TE_SLICE_BEGIN("Event"));
162*6dbdd20aSAndroid Build Coastguard Worker     benchmark::ClobberMemory();
163*6dbdd20aSAndroid Build Coastguard Worker   }
164*6dbdd20aSAndroid Build Coastguard Worker }
165*6dbdd20aSAndroid Build Coastguard Worker 
BM_Shlib_TeBasicNoIntern(benchmark::State & state)166*6dbdd20aSAndroid Build Coastguard Worker void BM_Shlib_TeBasicNoIntern(benchmark::State& state) {
167*6dbdd20aSAndroid Build Coastguard Worker   EnsureInitialized();
168*6dbdd20aSAndroid Build Coastguard Worker   TracingSession tracing_session = TracingSession::Builder()
169*6dbdd20aSAndroid Build Coastguard Worker                                        .set_data_source_name("track_event")
170*6dbdd20aSAndroid Build Coastguard Worker                                        .add_enabled_category("*")
171*6dbdd20aSAndroid Build Coastguard Worker                                        .Build();
172*6dbdd20aSAndroid Build Coastguard Worker 
173*6dbdd20aSAndroid Build Coastguard Worker   while (state.KeepRunning()) {
174*6dbdd20aSAndroid Build Coastguard Worker     PERFETTO_TE(benchmark_cat, PERFETTO_TE_SLICE_BEGIN("Event"),
175*6dbdd20aSAndroid Build Coastguard Worker                 PERFETTO_TE_NO_INTERN());
176*6dbdd20aSAndroid Build Coastguard Worker     benchmark::ClobberMemory();
177*6dbdd20aSAndroid Build Coastguard Worker   }
178*6dbdd20aSAndroid Build Coastguard Worker }
179*6dbdd20aSAndroid Build Coastguard Worker 
BM_Shlib_TeDebugAnnotations(benchmark::State & state)180*6dbdd20aSAndroid Build Coastguard Worker void BM_Shlib_TeDebugAnnotations(benchmark::State& state) {
181*6dbdd20aSAndroid Build Coastguard Worker   EnsureInitialized();
182*6dbdd20aSAndroid Build Coastguard Worker   TracingSession tracing_session = TracingSession::Builder()
183*6dbdd20aSAndroid Build Coastguard Worker                                        .set_data_source_name("track_event")
184*6dbdd20aSAndroid Build Coastguard Worker                                        .add_enabled_category("*")
185*6dbdd20aSAndroid Build Coastguard Worker                                        .Build();
186*6dbdd20aSAndroid Build Coastguard Worker 
187*6dbdd20aSAndroid Build Coastguard Worker   while (state.KeepRunning()) {
188*6dbdd20aSAndroid Build Coastguard Worker     PERFETTO_TE(benchmark_cat, PERFETTO_TE_SLICE_BEGIN("Event"),
189*6dbdd20aSAndroid Build Coastguard Worker                 PERFETTO_TE_ARG_UINT64("value", 42));
190*6dbdd20aSAndroid Build Coastguard Worker     benchmark::ClobberMemory();
191*6dbdd20aSAndroid Build Coastguard Worker   }
192*6dbdd20aSAndroid Build Coastguard Worker }
193*6dbdd20aSAndroid Build Coastguard Worker 
BM_Shlib_TeCustomProto(benchmark::State & state)194*6dbdd20aSAndroid Build Coastguard Worker void BM_Shlib_TeCustomProto(benchmark::State& state) {
195*6dbdd20aSAndroid Build Coastguard Worker   EnsureInitialized();
196*6dbdd20aSAndroid Build Coastguard Worker   TracingSession tracing_session = TracingSession::Builder()
197*6dbdd20aSAndroid Build Coastguard Worker                                        .set_data_source_name("track_event")
198*6dbdd20aSAndroid Build Coastguard Worker                                        .add_enabled_category("*")
199*6dbdd20aSAndroid Build Coastguard Worker                                        .Build();
200*6dbdd20aSAndroid Build Coastguard Worker 
201*6dbdd20aSAndroid Build Coastguard Worker   while (state.KeepRunning()) {
202*6dbdd20aSAndroid Build Coastguard Worker     PERFETTO_TE(
203*6dbdd20aSAndroid Build Coastguard Worker         benchmark_cat, PERFETTO_TE_SLICE_BEGIN("Event"),
204*6dbdd20aSAndroid Build Coastguard Worker         PERFETTO_TE_PROTO_FIELDS(PERFETTO_TE_PROTO_FIELD_NESTED(
205*6dbdd20aSAndroid Build Coastguard Worker             perfetto_protos_TrackEvent_debug_annotations_field_number,
206*6dbdd20aSAndroid Build Coastguard Worker             PERFETTO_TE_PROTO_FIELD_CSTR(
207*6dbdd20aSAndroid Build Coastguard Worker                 perfetto_protos_DebugAnnotation_name_field_number, "value"),
208*6dbdd20aSAndroid Build Coastguard Worker             PERFETTO_TE_PROTO_FIELD_VARINT(
209*6dbdd20aSAndroid Build Coastguard Worker                 perfetto_protos_DebugAnnotation_uint_value_field_number, 42))));
210*6dbdd20aSAndroid Build Coastguard Worker     benchmark::ClobberMemory();
211*6dbdd20aSAndroid Build Coastguard Worker   }
212*6dbdd20aSAndroid Build Coastguard Worker }
213*6dbdd20aSAndroid Build Coastguard Worker 
BM_Shlib_TeLlBasic(benchmark::State & state)214*6dbdd20aSAndroid Build Coastguard Worker void BM_Shlib_TeLlBasic(benchmark::State& state) {
215*6dbdd20aSAndroid Build Coastguard Worker   EnsureInitialized();
216*6dbdd20aSAndroid Build Coastguard Worker   TracingSession tracing_session = TracingSession::Builder()
217*6dbdd20aSAndroid Build Coastguard Worker                                        .set_data_source_name("track_event")
218*6dbdd20aSAndroid Build Coastguard Worker                                        .add_enabled_category("*")
219*6dbdd20aSAndroid Build Coastguard Worker                                        .Build();
220*6dbdd20aSAndroid Build Coastguard Worker 
221*6dbdd20aSAndroid Build Coastguard Worker   while (state.KeepRunning()) {
222*6dbdd20aSAndroid Build Coastguard Worker     if (PERFETTO_UNLIKELY(PERFETTO_ATOMIC_LOAD_EXPLICIT(
223*6dbdd20aSAndroid Build Coastguard Worker             benchmark_cat.enabled, PERFETTO_MEMORY_ORDER_RELAXED))) {
224*6dbdd20aSAndroid Build Coastguard Worker       struct PerfettoTeTimestamp timestamp = PerfettoTeGetTimestamp();
225*6dbdd20aSAndroid Build Coastguard Worker       int32_t type = PERFETTO_TE_TYPE_SLICE_BEGIN;
226*6dbdd20aSAndroid Build Coastguard Worker       const char* name = "Event";
227*6dbdd20aSAndroid Build Coastguard Worker       for (struct PerfettoTeLlIterator ctx =
228*6dbdd20aSAndroid Build Coastguard Worker                PerfettoTeLlBeginSlowPath(&benchmark_cat, timestamp);
229*6dbdd20aSAndroid Build Coastguard Worker            ctx.impl.ds.tracer != nullptr;
230*6dbdd20aSAndroid Build Coastguard Worker            PerfettoTeLlNext(&benchmark_cat, timestamp, &ctx)) {
231*6dbdd20aSAndroid Build Coastguard Worker         uint64_t name_iid;
232*6dbdd20aSAndroid Build Coastguard Worker         {
233*6dbdd20aSAndroid Build Coastguard Worker           struct PerfettoDsRootTracePacket trace_packet;
234*6dbdd20aSAndroid Build Coastguard Worker           PerfettoTeLlPacketBegin(&ctx, &trace_packet);
235*6dbdd20aSAndroid Build Coastguard Worker           PerfettoTeLlWriteTimestamp(&trace_packet.msg, &timestamp);
236*6dbdd20aSAndroid Build Coastguard Worker           perfetto_protos_TracePacket_set_sequence_flags(
237*6dbdd20aSAndroid Build Coastguard Worker               &trace_packet.msg,
238*6dbdd20aSAndroid Build Coastguard Worker               perfetto_protos_TracePacket_SEQ_NEEDS_INCREMENTAL_STATE);
239*6dbdd20aSAndroid Build Coastguard Worker           {
240*6dbdd20aSAndroid Build Coastguard Worker             struct PerfettoTeLlInternContext intern_ctx;
241*6dbdd20aSAndroid Build Coastguard Worker             PerfettoTeLlInternContextInit(&intern_ctx, ctx.impl.incr,
242*6dbdd20aSAndroid Build Coastguard Worker                                           &trace_packet.msg);
243*6dbdd20aSAndroid Build Coastguard Worker             PerfettoTeLlInternRegisteredCat(&intern_ctx, &benchmark_cat);
244*6dbdd20aSAndroid Build Coastguard Worker             name_iid = PerfettoTeLlInternEventName(&intern_ctx, name);
245*6dbdd20aSAndroid Build Coastguard Worker             PerfettoTeLlInternContextDestroy(&intern_ctx);
246*6dbdd20aSAndroid Build Coastguard Worker           }
247*6dbdd20aSAndroid Build Coastguard Worker           {
248*6dbdd20aSAndroid Build Coastguard Worker             struct perfetto_protos_TrackEvent te_msg;
249*6dbdd20aSAndroid Build Coastguard Worker             perfetto_protos_TracePacket_begin_track_event(&trace_packet.msg,
250*6dbdd20aSAndroid Build Coastguard Worker                                                           &te_msg);
251*6dbdd20aSAndroid Build Coastguard Worker             perfetto_protos_TrackEvent_set_type(
252*6dbdd20aSAndroid Build Coastguard Worker                 &te_msg,
253*6dbdd20aSAndroid Build Coastguard Worker                 static_cast<enum perfetto_protos_TrackEvent_Type>(type));
254*6dbdd20aSAndroid Build Coastguard Worker             PerfettoTeLlWriteRegisteredCat(&te_msg, &benchmark_cat);
255*6dbdd20aSAndroid Build Coastguard Worker             PerfettoTeLlWriteInternedEventName(&te_msg, name_iid);
256*6dbdd20aSAndroid Build Coastguard Worker             perfetto_protos_TracePacket_end_track_event(&trace_packet.msg,
257*6dbdd20aSAndroid Build Coastguard Worker                                                         &te_msg);
258*6dbdd20aSAndroid Build Coastguard Worker           }
259*6dbdd20aSAndroid Build Coastguard Worker           PerfettoTeLlPacketEnd(&ctx, &trace_packet);
260*6dbdd20aSAndroid Build Coastguard Worker         }
261*6dbdd20aSAndroid Build Coastguard Worker       }
262*6dbdd20aSAndroid Build Coastguard Worker     }
263*6dbdd20aSAndroid Build Coastguard Worker 
264*6dbdd20aSAndroid Build Coastguard Worker     benchmark::ClobberMemory();
265*6dbdd20aSAndroid Build Coastguard Worker   }
266*6dbdd20aSAndroid Build Coastguard Worker }
267*6dbdd20aSAndroid Build Coastguard Worker 
BM_Shlib_TeLlBasicNoIntern(benchmark::State & state)268*6dbdd20aSAndroid Build Coastguard Worker void BM_Shlib_TeLlBasicNoIntern(benchmark::State& state) {
269*6dbdd20aSAndroid Build Coastguard Worker   EnsureInitialized();
270*6dbdd20aSAndroid Build Coastguard Worker   TracingSession tracing_session = TracingSession::Builder()
271*6dbdd20aSAndroid Build Coastguard Worker                                        .set_data_source_name("track_event")
272*6dbdd20aSAndroid Build Coastguard Worker                                        .add_enabled_category("*")
273*6dbdd20aSAndroid Build Coastguard Worker                                        .Build();
274*6dbdd20aSAndroid Build Coastguard Worker 
275*6dbdd20aSAndroid Build Coastguard Worker   while (state.KeepRunning()) {
276*6dbdd20aSAndroid Build Coastguard Worker     if (PERFETTO_UNLIKELY(PERFETTO_ATOMIC_LOAD_EXPLICIT(
277*6dbdd20aSAndroid Build Coastguard Worker             benchmark_cat.enabled, PERFETTO_MEMORY_ORDER_RELAXED))) {
278*6dbdd20aSAndroid Build Coastguard Worker       struct PerfettoTeTimestamp timestamp = PerfettoTeGetTimestamp();
279*6dbdd20aSAndroid Build Coastguard Worker       int32_t type = PERFETTO_TE_TYPE_SLICE_BEGIN;
280*6dbdd20aSAndroid Build Coastguard Worker       const char* name = "Event";
281*6dbdd20aSAndroid Build Coastguard Worker       for (struct PerfettoTeLlIterator ctx =
282*6dbdd20aSAndroid Build Coastguard Worker                PerfettoTeLlBeginSlowPath(&benchmark_cat, timestamp);
283*6dbdd20aSAndroid Build Coastguard Worker            ctx.impl.ds.tracer != nullptr;
284*6dbdd20aSAndroid Build Coastguard Worker            PerfettoTeLlNext(&benchmark_cat, timestamp, &ctx)) {
285*6dbdd20aSAndroid Build Coastguard Worker         {
286*6dbdd20aSAndroid Build Coastguard Worker           struct PerfettoDsRootTracePacket trace_packet;
287*6dbdd20aSAndroid Build Coastguard Worker           PerfettoTeLlPacketBegin(&ctx, &trace_packet);
288*6dbdd20aSAndroid Build Coastguard Worker           PerfettoTeLlWriteTimestamp(&trace_packet.msg, &timestamp);
289*6dbdd20aSAndroid Build Coastguard Worker           perfetto_protos_TracePacket_set_sequence_flags(
290*6dbdd20aSAndroid Build Coastguard Worker               &trace_packet.msg,
291*6dbdd20aSAndroid Build Coastguard Worker               perfetto_protos_TracePacket_SEQ_NEEDS_INCREMENTAL_STATE);
292*6dbdd20aSAndroid Build Coastguard Worker           {
293*6dbdd20aSAndroid Build Coastguard Worker             struct PerfettoTeLlInternContext intern_ctx;
294*6dbdd20aSAndroid Build Coastguard Worker             PerfettoTeLlInternContextInit(&intern_ctx, ctx.impl.incr,
295*6dbdd20aSAndroid Build Coastguard Worker                                           &trace_packet.msg);
296*6dbdd20aSAndroid Build Coastguard Worker             PerfettoTeLlInternRegisteredCat(&intern_ctx, &benchmark_cat);
297*6dbdd20aSAndroid Build Coastguard Worker             PerfettoTeLlInternContextDestroy(&intern_ctx);
298*6dbdd20aSAndroid Build Coastguard Worker           }
299*6dbdd20aSAndroid Build Coastguard Worker           {
300*6dbdd20aSAndroid Build Coastguard Worker             struct perfetto_protos_TrackEvent te_msg;
301*6dbdd20aSAndroid Build Coastguard Worker             perfetto_protos_TracePacket_begin_track_event(&trace_packet.msg,
302*6dbdd20aSAndroid Build Coastguard Worker                                                           &te_msg);
303*6dbdd20aSAndroid Build Coastguard Worker             perfetto_protos_TrackEvent_set_type(
304*6dbdd20aSAndroid Build Coastguard Worker                 &te_msg,
305*6dbdd20aSAndroid Build Coastguard Worker                 static_cast<enum perfetto_protos_TrackEvent_Type>(type));
306*6dbdd20aSAndroid Build Coastguard Worker             PerfettoTeLlWriteRegisteredCat(&te_msg, &benchmark_cat);
307*6dbdd20aSAndroid Build Coastguard Worker             PerfettoTeLlWriteEventName(&te_msg, name);
308*6dbdd20aSAndroid Build Coastguard Worker             perfetto_protos_TracePacket_end_track_event(&trace_packet.msg,
309*6dbdd20aSAndroid Build Coastguard Worker                                                         &te_msg);
310*6dbdd20aSAndroid Build Coastguard Worker           }
311*6dbdd20aSAndroid Build Coastguard Worker           PerfettoTeLlPacketEnd(&ctx, &trace_packet);
312*6dbdd20aSAndroid Build Coastguard Worker         }
313*6dbdd20aSAndroid Build Coastguard Worker       }
314*6dbdd20aSAndroid Build Coastguard Worker     }
315*6dbdd20aSAndroid Build Coastguard Worker     benchmark::ClobberMemory();
316*6dbdd20aSAndroid Build Coastguard Worker   }
317*6dbdd20aSAndroid Build Coastguard Worker }
318*6dbdd20aSAndroid Build Coastguard Worker 
BM_Shlib_TeLlDebugAnnotations(benchmark::State & state)319*6dbdd20aSAndroid Build Coastguard Worker void BM_Shlib_TeLlDebugAnnotations(benchmark::State& state) {
320*6dbdd20aSAndroid Build Coastguard Worker   EnsureInitialized();
321*6dbdd20aSAndroid Build Coastguard Worker   TracingSession tracing_session = TracingSession::Builder()
322*6dbdd20aSAndroid Build Coastguard Worker                                        .set_data_source_name("track_event")
323*6dbdd20aSAndroid Build Coastguard Worker                                        .add_enabled_category("*")
324*6dbdd20aSAndroid Build Coastguard Worker                                        .Build();
325*6dbdd20aSAndroid Build Coastguard Worker 
326*6dbdd20aSAndroid Build Coastguard Worker   while (state.KeepRunning()) {
327*6dbdd20aSAndroid Build Coastguard Worker     if (PERFETTO_UNLIKELY(PERFETTO_ATOMIC_LOAD_EXPLICIT(
328*6dbdd20aSAndroid Build Coastguard Worker             benchmark_cat.enabled, PERFETTO_MEMORY_ORDER_RELAXED))) {
329*6dbdd20aSAndroid Build Coastguard Worker       struct PerfettoTeTimestamp timestamp = PerfettoTeGetTimestamp();
330*6dbdd20aSAndroid Build Coastguard Worker       int32_t type = PERFETTO_TE_TYPE_SLICE_BEGIN;
331*6dbdd20aSAndroid Build Coastguard Worker       const char* name = "Event";
332*6dbdd20aSAndroid Build Coastguard Worker       for (struct PerfettoTeLlIterator ctx =
333*6dbdd20aSAndroid Build Coastguard Worker                PerfettoTeLlBeginSlowPath(&benchmark_cat, timestamp);
334*6dbdd20aSAndroid Build Coastguard Worker            ctx.impl.ds.tracer != nullptr;
335*6dbdd20aSAndroid Build Coastguard Worker            PerfettoTeLlNext(&benchmark_cat, timestamp, &ctx)) {
336*6dbdd20aSAndroid Build Coastguard Worker         uint64_t name_iid;
337*6dbdd20aSAndroid Build Coastguard Worker         uint64_t dbg_arg_iid;
338*6dbdd20aSAndroid Build Coastguard Worker         {
339*6dbdd20aSAndroid Build Coastguard Worker           struct PerfettoDsRootTracePacket trace_packet;
340*6dbdd20aSAndroid Build Coastguard Worker           PerfettoTeLlPacketBegin(&ctx, &trace_packet);
341*6dbdd20aSAndroid Build Coastguard Worker           PerfettoTeLlWriteTimestamp(&trace_packet.msg, &timestamp);
342*6dbdd20aSAndroid Build Coastguard Worker           perfetto_protos_TracePacket_set_sequence_flags(
343*6dbdd20aSAndroid Build Coastguard Worker               &trace_packet.msg,
344*6dbdd20aSAndroid Build Coastguard Worker               perfetto_protos_TracePacket_SEQ_NEEDS_INCREMENTAL_STATE);
345*6dbdd20aSAndroid Build Coastguard Worker           {
346*6dbdd20aSAndroid Build Coastguard Worker             struct PerfettoTeLlInternContext intern_ctx;
347*6dbdd20aSAndroid Build Coastguard Worker             PerfettoTeLlInternContextInit(&intern_ctx, ctx.impl.incr,
348*6dbdd20aSAndroid Build Coastguard Worker                                           &trace_packet.msg);
349*6dbdd20aSAndroid Build Coastguard Worker             PerfettoTeLlInternRegisteredCat(&intern_ctx, &benchmark_cat);
350*6dbdd20aSAndroid Build Coastguard Worker             name_iid = PerfettoTeLlInternEventName(&intern_ctx, name);
351*6dbdd20aSAndroid Build Coastguard Worker             dbg_arg_iid = PerfettoTeLlInternDbgArgName(&intern_ctx, "value");
352*6dbdd20aSAndroid Build Coastguard Worker             PerfettoTeLlInternContextDestroy(&intern_ctx);
353*6dbdd20aSAndroid Build Coastguard Worker           }
354*6dbdd20aSAndroid Build Coastguard Worker           {
355*6dbdd20aSAndroid Build Coastguard Worker             struct perfetto_protos_TrackEvent te_msg;
356*6dbdd20aSAndroid Build Coastguard Worker             perfetto_protos_TracePacket_begin_track_event(&trace_packet.msg,
357*6dbdd20aSAndroid Build Coastguard Worker                                                           &te_msg);
358*6dbdd20aSAndroid Build Coastguard Worker             perfetto_protos_TrackEvent_set_type(
359*6dbdd20aSAndroid Build Coastguard Worker                 &te_msg,
360*6dbdd20aSAndroid Build Coastguard Worker                 static_cast<enum perfetto_protos_TrackEvent_Type>(type));
361*6dbdd20aSAndroid Build Coastguard Worker             PerfettoTeLlWriteRegisteredCat(&te_msg, &benchmark_cat);
362*6dbdd20aSAndroid Build Coastguard Worker             PerfettoTeLlWriteInternedEventName(&te_msg, name_iid);
363*6dbdd20aSAndroid Build Coastguard Worker             {
364*6dbdd20aSAndroid Build Coastguard Worker               struct perfetto_protos_DebugAnnotation dbg_arg;
365*6dbdd20aSAndroid Build Coastguard Worker               perfetto_protos_TrackEvent_begin_debug_annotations(&te_msg,
366*6dbdd20aSAndroid Build Coastguard Worker                                                                  &dbg_arg);
367*6dbdd20aSAndroid Build Coastguard Worker               perfetto_protos_DebugAnnotation_set_name_iid(&dbg_arg,
368*6dbdd20aSAndroid Build Coastguard Worker                                                            dbg_arg_iid);
369*6dbdd20aSAndroid Build Coastguard Worker               perfetto_protos_DebugAnnotation_set_uint_value(&dbg_arg, 42);
370*6dbdd20aSAndroid Build Coastguard Worker               perfetto_protos_TrackEvent_end_debug_annotations(&te_msg,
371*6dbdd20aSAndroid Build Coastguard Worker                                                                &dbg_arg);
372*6dbdd20aSAndroid Build Coastguard Worker             }
373*6dbdd20aSAndroid Build Coastguard Worker             perfetto_protos_TracePacket_end_track_event(&trace_packet.msg,
374*6dbdd20aSAndroid Build Coastguard Worker                                                         &te_msg);
375*6dbdd20aSAndroid Build Coastguard Worker           }
376*6dbdd20aSAndroid Build Coastguard Worker           PerfettoTeLlPacketEnd(&ctx, &trace_packet);
377*6dbdd20aSAndroid Build Coastguard Worker         }
378*6dbdd20aSAndroid Build Coastguard Worker       }
379*6dbdd20aSAndroid Build Coastguard Worker     }
380*6dbdd20aSAndroid Build Coastguard Worker     benchmark::ClobberMemory();
381*6dbdd20aSAndroid Build Coastguard Worker   }
382*6dbdd20aSAndroid Build Coastguard Worker }
383*6dbdd20aSAndroid Build Coastguard Worker 
BM_Shlib_TeLlCustomProto(benchmark::State & state)384*6dbdd20aSAndroid Build Coastguard Worker void BM_Shlib_TeLlCustomProto(benchmark::State& state) {
385*6dbdd20aSAndroid Build Coastguard Worker   EnsureInitialized();
386*6dbdd20aSAndroid Build Coastguard Worker   TracingSession tracing_session = TracingSession::Builder()
387*6dbdd20aSAndroid Build Coastguard Worker                                        .set_data_source_name("track_event")
388*6dbdd20aSAndroid Build Coastguard Worker                                        .add_enabled_category("*")
389*6dbdd20aSAndroid Build Coastguard Worker                                        .Build();
390*6dbdd20aSAndroid Build Coastguard Worker 
391*6dbdd20aSAndroid Build Coastguard Worker   while (state.KeepRunning()) {
392*6dbdd20aSAndroid Build Coastguard Worker     if (PERFETTO_UNLIKELY(PERFETTO_ATOMIC_LOAD_EXPLICIT(
393*6dbdd20aSAndroid Build Coastguard Worker             benchmark_cat.enabled, PERFETTO_MEMORY_ORDER_RELAXED))) {
394*6dbdd20aSAndroid Build Coastguard Worker       struct PerfettoTeTimestamp timestamp = PerfettoTeGetTimestamp();
395*6dbdd20aSAndroid Build Coastguard Worker       int32_t type = PERFETTO_TE_TYPE_SLICE_BEGIN;
396*6dbdd20aSAndroid Build Coastguard Worker       const char* name = "Event";
397*6dbdd20aSAndroid Build Coastguard Worker       for (struct PerfettoTeLlIterator ctx =
398*6dbdd20aSAndroid Build Coastguard Worker                PerfettoTeLlBeginSlowPath(&benchmark_cat, timestamp);
399*6dbdd20aSAndroid Build Coastguard Worker            ctx.impl.ds.tracer != nullptr;
400*6dbdd20aSAndroid Build Coastguard Worker            PerfettoTeLlNext(&benchmark_cat, timestamp, &ctx)) {
401*6dbdd20aSAndroid Build Coastguard Worker         uint64_t name_iid;
402*6dbdd20aSAndroid Build Coastguard Worker         {
403*6dbdd20aSAndroid Build Coastguard Worker           struct PerfettoDsRootTracePacket trace_packet;
404*6dbdd20aSAndroid Build Coastguard Worker           PerfettoTeLlPacketBegin(&ctx, &trace_packet);
405*6dbdd20aSAndroid Build Coastguard Worker           PerfettoTeLlWriteTimestamp(&trace_packet.msg, &timestamp);
406*6dbdd20aSAndroid Build Coastguard Worker           perfetto_protos_TracePacket_set_sequence_flags(
407*6dbdd20aSAndroid Build Coastguard Worker               &trace_packet.msg,
408*6dbdd20aSAndroid Build Coastguard Worker               perfetto_protos_TracePacket_SEQ_NEEDS_INCREMENTAL_STATE);
409*6dbdd20aSAndroid Build Coastguard Worker           {
410*6dbdd20aSAndroid Build Coastguard Worker             struct PerfettoTeLlInternContext intern_ctx;
411*6dbdd20aSAndroid Build Coastguard Worker             PerfettoTeLlInternContextInit(&intern_ctx, ctx.impl.incr,
412*6dbdd20aSAndroid Build Coastguard Worker                                           &trace_packet.msg);
413*6dbdd20aSAndroid Build Coastguard Worker             PerfettoTeLlInternRegisteredCat(&intern_ctx, &benchmark_cat);
414*6dbdd20aSAndroid Build Coastguard Worker             name_iid = PerfettoTeLlInternEventName(&intern_ctx, name);
415*6dbdd20aSAndroid Build Coastguard Worker             PerfettoTeLlInternContextDestroy(&intern_ctx);
416*6dbdd20aSAndroid Build Coastguard Worker           }
417*6dbdd20aSAndroid Build Coastguard Worker           {
418*6dbdd20aSAndroid Build Coastguard Worker             struct perfetto_protos_TrackEvent te_msg;
419*6dbdd20aSAndroid Build Coastguard Worker             perfetto_protos_TracePacket_begin_track_event(&trace_packet.msg,
420*6dbdd20aSAndroid Build Coastguard Worker                                                           &te_msg);
421*6dbdd20aSAndroid Build Coastguard Worker             perfetto_protos_TrackEvent_set_type(
422*6dbdd20aSAndroid Build Coastguard Worker                 &te_msg,
423*6dbdd20aSAndroid Build Coastguard Worker                 static_cast<enum perfetto_protos_TrackEvent_Type>(type));
424*6dbdd20aSAndroid Build Coastguard Worker             PerfettoTeLlWriteRegisteredCat(&te_msg, &benchmark_cat);
425*6dbdd20aSAndroid Build Coastguard Worker             PerfettoTeLlWriteInternedEventName(&te_msg, name_iid);
426*6dbdd20aSAndroid Build Coastguard Worker             {
427*6dbdd20aSAndroid Build Coastguard Worker               struct perfetto_protos_DebugAnnotation dbg_arg;
428*6dbdd20aSAndroid Build Coastguard Worker               perfetto_protos_TrackEvent_begin_debug_annotations(&te_msg,
429*6dbdd20aSAndroid Build Coastguard Worker                                                                  &dbg_arg);
430*6dbdd20aSAndroid Build Coastguard Worker               perfetto_protos_DebugAnnotation_set_cstr_name(&dbg_arg, "value");
431*6dbdd20aSAndroid Build Coastguard Worker               perfetto_protos_DebugAnnotation_set_uint_value(&dbg_arg, 42);
432*6dbdd20aSAndroid Build Coastguard Worker               perfetto_protos_TrackEvent_end_debug_annotations(&te_msg,
433*6dbdd20aSAndroid Build Coastguard Worker                                                                &dbg_arg);
434*6dbdd20aSAndroid Build Coastguard Worker             }
435*6dbdd20aSAndroid Build Coastguard Worker             perfetto_protos_TracePacket_end_track_event(&trace_packet.msg,
436*6dbdd20aSAndroid Build Coastguard Worker                                                         &te_msg);
437*6dbdd20aSAndroid Build Coastguard Worker           }
438*6dbdd20aSAndroid Build Coastguard Worker           PerfettoTeLlPacketEnd(&ctx, &trace_packet);
439*6dbdd20aSAndroid Build Coastguard Worker         }
440*6dbdd20aSAndroid Build Coastguard Worker       }
441*6dbdd20aSAndroid Build Coastguard Worker     }
442*6dbdd20aSAndroid Build Coastguard Worker     benchmark::ClobberMemory();
443*6dbdd20aSAndroid Build Coastguard Worker   }
444*6dbdd20aSAndroid Build Coastguard Worker }
445*6dbdd20aSAndroid Build Coastguard Worker 
446*6dbdd20aSAndroid Build Coastguard Worker }  // namespace
447*6dbdd20aSAndroid Build Coastguard Worker 
448*6dbdd20aSAndroid Build Coastguard Worker BENCHMARK(BM_Shlib_DataSource_Disabled);
449*6dbdd20aSAndroid Build Coastguard Worker BENCHMARK(BM_Shlib_DataSource_DifferentPacketSize)->Range(1, 1000);
450*6dbdd20aSAndroid Build Coastguard Worker BENCHMARK(BM_Shlib_TeDisabled);
451*6dbdd20aSAndroid Build Coastguard Worker BENCHMARK(BM_Shlib_TeBasic);
452*6dbdd20aSAndroid Build Coastguard Worker BENCHMARK(BM_Shlib_TeBasicNoIntern);
453*6dbdd20aSAndroid Build Coastguard Worker BENCHMARK(BM_Shlib_TeDebugAnnotations);
454*6dbdd20aSAndroid Build Coastguard Worker BENCHMARK(BM_Shlib_TeCustomProto);
455*6dbdd20aSAndroid Build Coastguard Worker BENCHMARK(BM_Shlib_TeLlBasic);
456*6dbdd20aSAndroid Build Coastguard Worker BENCHMARK(BM_Shlib_TeLlBasicNoIntern);
457*6dbdd20aSAndroid Build Coastguard Worker BENCHMARK(BM_Shlib_TeLlDebugAnnotations);
458*6dbdd20aSAndroid Build Coastguard Worker BENCHMARK(BM_Shlib_TeLlCustomProto);
459