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, ×tamp);
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, ×tamp);
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, ×tamp);
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, ×tamp);
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