// Copyright (C) 2023 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //! Benchmark for ATrace tracing subscriber. use atrace_rust_benchmark_common::{new_criterion, turn_tracing_off, turn_tracing_on}; use atrace_tracing_subscriber::AtraceSubscriber; use criterion::Criterion; use tracing_subscriber::prelude::__tracing_subscriber_SubscriberExt; fn make_example_vec() -> Vec { Vec::from([1, 2, 3, 4]) } fn bench_with_subscriber(c: &mut Criterion, name: &str, mut f: F) where F: FnMut(), { let subscriber = tracing_subscriber::registry().with(AtraceSubscriber::default()); tracing::subscriber::with_default(subscriber, || { c.bench_function(name, |b| b.iter(&mut f)); }); } fn bench_with_filtering_subscriber(c: &mut Criterion, name: &str, mut f: F) where F: FnMut(), { let subscriber = tracing_subscriber::registry().with(AtraceSubscriber::default().with_filter()); tracing::subscriber::with_default(subscriber, || { c.bench_function(name, |b| b.iter(&mut f)); }); } fn bench_tracing_off_event(c: &mut Criterion) { turn_tracing_off(); bench_with_subscriber(c, "tracing_off_event", || tracing::info!("bench info event")); } fn bench_filtered_event(c: &mut Criterion) { turn_tracing_off(); bench_with_filtering_subscriber(c, "filtered_event", || tracing::info!("bench info event")); } fn bench_tracing_off_event_args(c: &mut Criterion) { turn_tracing_off(); let v = make_example_vec(); bench_with_subscriber(c, "tracing_off_event_args", || { tracing::info!(debug_arg1 = 123, debug_arg2 = "argument", debug_arg3 = ?v, debug_arg4 = "last", "bench info event") }); } fn bench_filtered_event_args(c: &mut Criterion) { turn_tracing_off(); let v = make_example_vec(); bench_with_filtering_subscriber(c, "filtered_event_args", || { tracing::info!(debug_arg1 = 123, debug_arg2 = "argument", debug_arg3 = ?v, debug_arg4 = "last", "bench info event") }); } fn bench_tracing_off_span(c: &mut Criterion) { turn_tracing_off(); bench_with_subscriber(c, "tracing_off_span", || { let _entered = tracing::info_span!("bench info span").entered(); }); } fn bench_filtered_span(c: &mut Criterion) { turn_tracing_off(); bench_with_filtering_subscriber(c, "filtered_span", || { let _entered = tracing::info_span!("bench info span").entered(); }); } fn bench_tracing_off_span_args(c: &mut Criterion) { turn_tracing_off(); let v = make_example_vec(); bench_with_subscriber(c, "tracing_off_span_args", || { let _entered = tracing::info_span!("bench info span", debug_arg1 = 123, debug_arg2 = "argument", debug_arg3 = ?v, debug_arg4 = "last") .entered(); }); } fn bench_filtered_span_args(c: &mut Criterion) { turn_tracing_off(); let v = make_example_vec(); bench_with_filtering_subscriber(c, "filtered_span_args", || { let _entered = tracing::info_span!("bench info span", debug_arg1 = 123, debug_arg2 = "argument", debug_arg3 = ?v, debug_arg4 = "last") .entered(); }); } fn bench_tracing_on_event(c: &mut Criterion) { turn_tracing_on(); bench_with_subscriber(c, "tracing_on_event", || tracing::info!("bench info event")); turn_tracing_off(); } fn bench_tracing_on_event_args(c: &mut Criterion) { turn_tracing_on(); let v = make_example_vec(); bench_with_subscriber(c, "tracing_on_event_args", || { tracing::info!(debug_arg1 = 123, debug_arg2 = "argument", debug_arg3 = ?v, debug_arg4 = "last", "bench info event") }); turn_tracing_off(); } fn bench_tracing_on_span(c: &mut Criterion) { turn_tracing_on(); bench_with_subscriber(c, "tracing_on_span", || { let _entered = tracing::info_span!("bench info span").entered(); }); turn_tracing_off(); } fn bench_tracing_on_span_args(c: &mut Criterion) { turn_tracing_on(); let v = make_example_vec(); bench_with_subscriber(c, "tracing_on_span_args", || { let _entered = tracing::info_span!("bench info span", debug_arg1 = 123, debug_arg2 = "argument", debug_arg3 = ?v, debug_arg4 = "last") .entered(); }); turn_tracing_off(); } fn main() -> Result<(), Box> { let mut criterion = new_criterion(); bench_tracing_off_event(&mut criterion); bench_filtered_event(&mut criterion); bench_tracing_off_event_args(&mut criterion); bench_filtered_event_args(&mut criterion); bench_tracing_off_span(&mut criterion); bench_filtered_span(&mut criterion); bench_tracing_off_span_args(&mut criterion); bench_filtered_span_args(&mut criterion); bench_tracing_on_event(&mut criterion); bench_tracing_on_event_args(&mut criterion); bench_tracing_on_span(&mut criterion); bench_tracing_on_span_args(&mut criterion); Ok(()) }