| use criterion::{black_box, criterion_group, criterion_main, Criterion}; |
| use tracing::Level; |
| |
| struct FakeEmptySpan { |
| inner: Option<(usize, std::sync::Arc<()>)>, |
| meta: Option<&'static ()>, |
| } |
| |
| impl FakeEmptySpan { |
| fn new() -> Self { |
| Self { |
| inner: None, |
| meta: None, |
| } |
| } |
| } |
| |
| impl Drop for FakeEmptySpan { |
| fn drop(&mut self) { |
| black_box(&self.inner); |
| black_box(&self.meta); |
| } |
| } |
| |
| fn bench_no_subscriber(c: &mut Criterion) { |
| use std::sync::atomic::{AtomicUsize, Ordering}; |
| |
| let mut group = c.benchmark_group("no_subscriber"); |
| |
| group.bench_function("span", |b| { |
| b.iter(|| { |
| let span = tracing::span!(Level::TRACE, "span"); |
| black_box(&span); |
| }) |
| }); |
| group.bench_function("span_enter", |b| { |
| b.iter(|| { |
| let span = tracing::span!(Level::TRACE, "span"); |
| let _e = span.enter(); |
| }) |
| }); |
| group.bench_function("empty_span", |b| { |
| b.iter(|| { |
| let span = tracing::span::Span::none(); |
| black_box(&span); |
| }); |
| }); |
| group.bench_function("empty_struct", |b| { |
| b.iter(|| { |
| let span = FakeEmptySpan::new(); |
| black_box(&span); |
| }) |
| }); |
| group.bench_function("event", |b| { |
| b.iter(|| { |
| tracing::event!(Level::TRACE, "hello"); |
| }) |
| }); |
| group.bench_function("relaxed_load", |b| { |
| let foo = AtomicUsize::new(1); |
| b.iter(|| black_box(foo.load(Ordering::Relaxed))); |
| }); |
| group.bench_function("acquire_load", |b| { |
| let foo = AtomicUsize::new(1); |
| b.iter(|| black_box(foo.load(Ordering::Acquire))) |
| }); |
| group.bench_function("log", |b| { |
| b.iter(|| { |
| log::log!(log::Level::Info, "log"); |
| }) |
| }); |
| group.finish(); |
| } |
| |
| fn bench_fields(c: &mut Criterion) { |
| let mut group = c.benchmark_group("no_subscriber_field"); |
| group.bench_function("span", |b| { |
| b.iter(|| { |
| black_box(tracing::span!( |
| Level::TRACE, |
| "span", |
| foo = tracing::field::display(format!("bar {:?}", 2)) |
| )); |
| }) |
| }); |
| group.bench_function("event", |b| { |
| b.iter(|| { |
| tracing::event!( |
| Level::TRACE, |
| foo = tracing::field::display(format!("bar {:?}", 2)) |
| ); |
| }) |
| }); |
| group.bench_function("log", |b| { |
| b.iter(|| log::log!(log::Level::Trace, "{}", format!("bar {:?}", 2))) |
| }); |
| group.finish(); |
| } |
| |
| criterion_group!(benches, bench_no_subscriber, bench_fields); |
| criterion_main!(benches); |