trace: Switch benchmarks to criterion (#1163)

Extracted from #1152

This makes it possible to run benchmarks on stable + gives more statistical reliability.
This commit is contained in:
James Gilles
2019-06-24 12:05:45 -07:00
committed by Eliza Weisman
parent aac6998c22
commit aa99950b9c
3 changed files with 100 additions and 96 deletions
+8
View File
@@ -31,6 +31,7 @@ ansi_term = "0.11"
humantime = "1.1.1"
futures = "0.1"
log = "0.4"
criterion = { version = "0.2", default_features = false }
# These are used for the "basic" example from the tokio-trace-prototype repo,
# which is currently not included as it used the `tokio-trace-log` crate, and
# that crate is currently unstable.
@@ -52,3 +53,10 @@ release_max_level_info = []
release_max_level_debug = []
release_max_level_trace = []
[[bench]]
name = "subscriber"
harness = false
[[bench]]
name = "no_subscriber"
harness = false
+31 -35
View File
@@ -1,46 +1,42 @@
#![feature(test)]
#[macro_use]
extern crate tokio_trace;
#[macro_use]
extern crate log;
extern crate test;
use test::Bencher;
#[macro_use]
extern crate criterion;
use criterion::Criterion;
use tokio_trace::Level;
#[bench]
fn bench_span_no_subscriber(b: &mut Bencher) {
b.iter(|| {
span!(Level::TRACE, "span");
fn criterion_benchmark(c: &mut Criterion) {
c.bench_function("span_no_subscriber", |b| {
b.iter(|| {
span!(Level::TRACE, "span");
})
});
}
#[bench]
fn bench_log_no_logger(b: &mut Bencher) {
b.iter(|| {
log!(log::Level::Info, "log");
c.bench_function("bench_log_no_logger", |b| {
b.iter(|| {
log!(log::Level::Info, "log");
});
});
}
#[bench]
fn bench_costly_field_no_subscriber(b: &mut Bencher) {
b.iter(|| {
span!(
Level::TRACE,
"span",
foo = tokio_trace::field::display(format!("bar {:?}", 2))
);
c.bench_function("bench_costly_field_no_subscriber", |b| {
b.iter(|| {
span!(
Level::TRACE,
"span",
foo = tokio_trace::field::display(format!("bar {:?}", 2))
);
});
});
}
#[bench]
fn bench_no_span_no_subscriber(b: &mut Bencher) {
b.iter(|| {});
}
#[bench]
fn bench_1_atomic_load(b: &mut Bencher) {
// This is just included as a baseline.
use std::sync::atomic::{AtomicUsize, Ordering};
let foo = AtomicUsize::new(1);
b.iter(|| foo.load(Ordering::Relaxed));
c.bench_function("bench_no_span_no_subscriber", |b| {
b.iter(|| {});
});
c.bench_function("bench_1_atomic_load", |b| {
use std::sync::atomic::{AtomicUsize, Ordering};
let foo = AtomicUsize::new(1);
b.iter(|| foo.load(Ordering::Relaxed));
});
}
criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);
+61 -61
View File
@@ -1,9 +1,9 @@
#![feature(test)]
#[macro_use]
extern crate tokio_trace;
extern crate test;
use test::Bencher;
#[macro_use]
extern crate criterion;
use criterion::{black_box, Criterion};
use tokio_trace::Level;
use std::{
@@ -96,63 +96,63 @@ impl tokio_trace::Subscriber for VisitingSubscriber {
const N_SPANS: usize = 100;
#[bench]
fn span_no_fields(b: &mut Bencher) {
tokio_trace::subscriber::with_default(EnabledSubscriber, || {
b.iter(|| span!(Level::TRACE, "span"))
fn criterion_benchmark(c: &mut Criterion) {
c.bench_function("span_no_fields", |b| {
tokio_trace::subscriber::with_default(EnabledSubscriber, || {
b.iter(|| span!(Level::TRACE, "span"))
});
});
c.bench_function("enter_span", |b| {
tokio_trace::subscriber::with_default(EnabledSubscriber, || {
let span = span!(Level::TRACE, "span");
b.iter(|| black_box(span.in_scope(|| {})))
});
});
c.bench_function("span_repeatedly", |b| {
#[inline]
fn mk_span(i: u64) -> tokio_trace::Span {
span!(Level::TRACE, "span", i = i)
}
let n = black_box(N_SPANS);
tokio_trace::subscriber::with_default(EnabledSubscriber, || {
b.iter(|| (0..n).fold(mk_span(0), |_, i| mk_span(i as u64)))
});
});
c.bench_function("span_with_fields", |b| {
tokio_trace::subscriber::with_default(EnabledSubscriber, || {
b.iter(|| {
span!(
Level::TRACE,
"span",
foo = "foo",
bar = "bar",
baz = 3,
quuux = tokio_trace::field::debug(0.99)
)
})
});
});
c.bench_function("span_with_fields_record", |b| {
let subscriber = VisitingSubscriber(Mutex::new(String::from("")));
tokio_trace::subscriber::with_default(subscriber, || {
b.iter(|| {
span!(
Level::TRACE,
"span",
foo = "foo",
bar = "bar",
baz = 3,
quuux = tokio_trace::field::debug(0.99)
)
})
});
});
}
#[bench]
fn enter_span(b: &mut Bencher) {
tokio_trace::subscriber::with_default(EnabledSubscriber, || {
let span = span!(Level::TRACE, "span");
b.iter(|| test::black_box(span.in_scope(|| {})))
});
}
#[bench]
fn span_repeatedly(b: &mut Bencher) {
#[inline]
fn mk_span(i: u64) -> tokio_trace::Span {
span!(Level::TRACE, "span", i = i)
}
let n = test::black_box(N_SPANS);
tokio_trace::subscriber::with_default(EnabledSubscriber, || {
b.iter(|| (0..n).fold(mk_span(0), |_, i| mk_span(i as u64)))
});
}
#[bench]
fn span_with_fields(b: &mut Bencher) {
tokio_trace::subscriber::with_default(EnabledSubscriber, || {
b.iter(|| {
span!(
Level::TRACE,
"span",
foo = "foo",
bar = "bar",
baz = 3,
quuux = tokio_trace::field::debug(0.99)
)
})
});
}
#[bench]
fn span_with_fields_record(b: &mut Bencher) {
let subscriber = VisitingSubscriber(Mutex::new(String::from("")));
tokio_trace::subscriber::with_default(subscriber, || {
b.iter(|| {
span!(
Level::TRACE,
"span",
foo = "foo",
bar = "bar",
baz = 3,
quuux = tokio_trace::field::debug(0.99)
)
})
});
}
criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);