1 // Copyright (C) 2023 The Android Open Source Project
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 //! Benchmark for ATrace tracing subscriber.
16 
17 use atrace_rust_benchmark_common::{new_criterion, turn_tracing_off, turn_tracing_on};
18 use atrace_tracing_subscriber::AtraceSubscriber;
19 use criterion::Criterion;
20 use tracing_subscriber::prelude::__tracing_subscriber_SubscriberExt;
21 
make_example_vec() -> Vec<i32>22 fn make_example_vec() -> Vec<i32> {
23     Vec::from([1, 2, 3, 4])
24 }
25 
bench_with_subscriber<F>(c: &mut Criterion, name: &str, mut f: F) where F: FnMut(),26 fn bench_with_subscriber<F>(c: &mut Criterion, name: &str, mut f: F)
27 where
28     F: FnMut(),
29 {
30     let subscriber = tracing_subscriber::registry().with(AtraceSubscriber::default());
31     tracing::subscriber::with_default(subscriber, || {
32         c.bench_function(name, |b| b.iter(&mut f));
33     });
34 }
35 
bench_with_filtering_subscriber<F>(c: &mut Criterion, name: &str, mut f: F) where F: FnMut(),36 fn bench_with_filtering_subscriber<F>(c: &mut Criterion, name: &str, mut f: F)
37 where
38     F: FnMut(),
39 {
40     let subscriber = tracing_subscriber::registry().with(AtraceSubscriber::default().with_filter());
41     tracing::subscriber::with_default(subscriber, || {
42         c.bench_function(name, |b| b.iter(&mut f));
43     });
44 }
45 
bench_tracing_off_event(c: &mut Criterion)46 fn bench_tracing_off_event(c: &mut Criterion) {
47     turn_tracing_off();
48     bench_with_subscriber(c, "tracing_off_event", || tracing::info!("bench info event"));
49 }
50 
bench_filtered_event(c: &mut Criterion)51 fn bench_filtered_event(c: &mut Criterion) {
52     turn_tracing_off();
53     bench_with_filtering_subscriber(c, "filtered_event", || tracing::info!("bench info event"));
54 }
55 
bench_tracing_off_event_args(c: &mut Criterion)56 fn bench_tracing_off_event_args(c: &mut Criterion) {
57     turn_tracing_off();
58     let v = make_example_vec();
59     bench_with_subscriber(c, "tracing_off_event_args", || {
60         tracing::info!(debug_arg1 = 123,
61             debug_arg2 = "argument",
62             debug_arg3 = ?v,
63             debug_arg4 = "last",
64             "bench info event")
65     });
66 }
67 
bench_filtered_event_args(c: &mut Criterion)68 fn bench_filtered_event_args(c: &mut Criterion) {
69     turn_tracing_off();
70     let v = make_example_vec();
71     bench_with_filtering_subscriber(c, "filtered_event_args", || {
72         tracing::info!(debug_arg1 = 123,
73             debug_arg2 = "argument",
74             debug_arg3 = ?v,
75             debug_arg4 = "last",
76             "bench info event")
77     });
78 }
79 
bench_tracing_off_span(c: &mut Criterion)80 fn bench_tracing_off_span(c: &mut Criterion) {
81     turn_tracing_off();
82     bench_with_subscriber(c, "tracing_off_span", || {
83         let _entered = tracing::info_span!("bench info span").entered();
84     });
85 }
86 
bench_filtered_span(c: &mut Criterion)87 fn bench_filtered_span(c: &mut Criterion) {
88     turn_tracing_off();
89     bench_with_filtering_subscriber(c, "filtered_span", || {
90         let _entered = tracing::info_span!("bench info span").entered();
91     });
92 }
93 
bench_tracing_off_span_args(c: &mut Criterion)94 fn bench_tracing_off_span_args(c: &mut Criterion) {
95     turn_tracing_off();
96     let v = make_example_vec();
97     bench_with_subscriber(c, "tracing_off_span_args", || {
98         let _entered = tracing::info_span!("bench info span", debug_arg1 = 123,
99             debug_arg2 = "argument",
100             debug_arg3 = ?v,
101             debug_arg4 = "last")
102         .entered();
103     });
104 }
105 
bench_filtered_span_args(c: &mut Criterion)106 fn bench_filtered_span_args(c: &mut Criterion) {
107     turn_tracing_off();
108     let v = make_example_vec();
109     bench_with_filtering_subscriber(c, "filtered_span_args", || {
110         let _entered = tracing::info_span!("bench info span", debug_arg1 = 123,
111             debug_arg2 = "argument",
112             debug_arg3 = ?v,
113             debug_arg4 = "last")
114         .entered();
115     });
116 }
117 
bench_tracing_on_event(c: &mut Criterion)118 fn bench_tracing_on_event(c: &mut Criterion) {
119     turn_tracing_on();
120     bench_with_subscriber(c, "tracing_on_event", || tracing::info!("bench info event"));
121     turn_tracing_off();
122 }
123 
bench_tracing_on_event_args(c: &mut Criterion)124 fn bench_tracing_on_event_args(c: &mut Criterion) {
125     turn_tracing_on();
126     let v = make_example_vec();
127     bench_with_subscriber(c, "tracing_on_event_args", || {
128         tracing::info!(debug_arg1 = 123,
129             debug_arg2 = "argument",
130             debug_arg3 = ?v,
131             debug_arg4 = "last",
132             "bench info event")
133     });
134     turn_tracing_off();
135 }
136 
bench_tracing_on_span(c: &mut Criterion)137 fn bench_tracing_on_span(c: &mut Criterion) {
138     turn_tracing_on();
139     bench_with_subscriber(c, "tracing_on_span", || {
140         let _entered = tracing::info_span!("bench info span").entered();
141     });
142     turn_tracing_off();
143 }
144 
bench_tracing_on_span_args(c: &mut Criterion)145 fn bench_tracing_on_span_args(c: &mut Criterion) {
146     turn_tracing_on();
147     let v = make_example_vec();
148     bench_with_subscriber(c, "tracing_on_span_args", || {
149         let _entered = tracing::info_span!("bench info span", debug_arg1 = 123,
150             debug_arg2 = "argument",
151             debug_arg3 = ?v,
152             debug_arg4 = "last")
153         .entered();
154     });
155     turn_tracing_off();
156 }
157 
main() -> Result<(), Box<dyn std::error::Error>>158 fn main() -> Result<(), Box<dyn std::error::Error>> {
159     let mut criterion = new_criterion();
160 
161     bench_tracing_off_event(&mut criterion);
162     bench_filtered_event(&mut criterion);
163     bench_tracing_off_event_args(&mut criterion);
164     bench_filtered_event_args(&mut criterion);
165     bench_tracing_off_span(&mut criterion);
166     bench_filtered_span(&mut criterion);
167     bench_tracing_off_span_args(&mut criterion);
168     bench_filtered_span_args(&mut criterion);
169 
170     bench_tracing_on_event(&mut criterion);
171     bench_tracing_on_event_args(&mut criterion);
172     bench_tracing_on_span(&mut criterion);
173     bench_tracing_on_span_args(&mut criterion);
174 
175     Ok(())
176 }
177