use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion};
use renacer::ring_buffer::SpanRingBuffer;
use renacer::span_record::{SpanKind, SpanRecord, StatusCode};
use std::collections::HashMap;
fn create_bench_span(i: u64) -> SpanRecord {
SpanRecord::new(
[1; 16],
[(i as u8); 8],
None,
format!("bench_span_{}", i),
SpanKind::Internal,
i * 1000,
i * 2000,
i,
StatusCode::Ok,
String::new(),
HashMap::new(),
HashMap::new(),
1234,
5678,
)
}
fn bench_ring_buffer_push(c: &mut Criterion) {
let buffer = SpanRingBuffer::new(16384);
let mut i = 0u64;
c.bench_function("ring_buffer_push", |b| {
b.iter(|| {
let span = create_bench_span(i);
buffer.push(black_box(span));
i += 1;
});
});
std::mem::drop(buffer);
}
fn bench_ring_buffer_push_varying_capacity(c: &mut Criterion) {
let mut group = c.benchmark_group("ring_buffer_push_capacity");
for capacity in [1024, 4096, 8192, 16384, 32768] {
group.bench_with_input(BenchmarkId::from_parameter(capacity), &capacity, |b, &capacity| {
let buffer = SpanRingBuffer::new(capacity);
let mut i = 0u64;
b.iter(|| {
let span = create_bench_span(i);
buffer.push(black_box(span));
i += 1;
});
std::mem::drop(buffer);
});
}
group.finish();
}
fn bench_span_creation(c: &mut Criterion) {
let mut i = 0u64;
c.bench_function("span_creation", |b| {
b.iter(|| {
let span = create_bench_span(black_box(i));
i += 1;
black_box(span);
});
});
}
fn bench_lamport_clock_tick(c: &mut Criterion) {
use renacer::lamport_clock::LamportClock;
let clock = LamportClock::new();
c.bench_function("lamport_clock_tick", |b| {
b.iter(|| {
black_box(clock.tick());
});
});
}
fn bench_complete_hot_path(c: &mut Criterion) {
use renacer::lamport_clock::LamportClock;
let buffer = SpanRingBuffer::new(16384);
let clock = LamportClock::new();
c.bench_function("complete_hot_path", |b| {
b.iter(|| {
let logical_time = clock.tick();
let span = SpanRecord::new(
black_box([1; 16]),
black_box([2; 8]),
None,
black_box("syscall".to_string()),
SpanKind::Internal,
black_box(1000),
black_box(2000),
logical_time,
StatusCode::Ok,
String::new(),
HashMap::new(),
HashMap::new(),
1234,
5678,
);
buffer.push(black_box(span));
});
});
std::mem::drop(buffer);
}
fn bench_synchronous_write_baseline(c: &mut Criterion) {
use std::io::Write;
use tempfile::NamedTempFile;
c.bench_function("synchronous_write_baseline", |b| {
let mut file = NamedTempFile::new().expect("test");
b.iter(|| {
let data = b"span data here\n";
file.write_all(black_box(data)).expect("test");
file.flush().expect("test"); });
});
}
fn bench_ring_buffer_stats(c: &mut Criterion) {
let buffer = SpanRingBuffer::new(8192);
for i in 0..100 {
buffer.push(create_bench_span(i));
}
c.bench_function("ring_buffer_stats", |b| {
b.iter(|| {
black_box(buffer.stats());
});
});
std::mem::drop(buffer);
}
criterion_group!(
benches,
bench_ring_buffer_push,
bench_ring_buffer_push_varying_capacity,
bench_span_creation,
bench_lamport_clock_tick,
bench_complete_hot_path,
bench_synchronous_write_baseline,
bench_ring_buffer_stats,
);
criterion_main!(benches);