Skip to content

Commit e7b91ae

Browse files
perf: Phase F-6 — compact replay benchmarks (2.2x speedup measured)
Benchmark results (1M events, LRU, release mode): - String replay: 160ms - Compact replay: 72ms (2.2x faster) - intern_batch: 121ms (one-time conversion cost) For N-policy comparison (compare command), amortized cost: - String: 160ms × N - Compact: 121ms + 72ms × N (wins at N >= 2) New benchmarks: - lru_replay_1m_string vs lru_replay_1m_compact - intern_batch_1m (conversion overhead) - memory_string_100k vs memory_compact_100k (clone cost proxy)
1 parent e7d1936 commit e7b91ae

1 file changed

Lines changed: 64 additions & 3 deletions

File tree

crates/qc-simulate/benches/trace_replay.rs

Lines changed: 64 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
use criterion::{black_box, criterion_group, criterion_main, Criterion};
2+
use qc_model::compact_trace::CompactTraceEvent;
23
use qc_simulate::baselines::{GdsfPolicy, LruPolicy};
3-
use qc_simulate::engine::TraceReplayEngine;
4+
use qc_simulate::compact_baselines::CompactLruPolicy;
5+
use qc_simulate::engine::{CompactReplayEconConfig, ReplayEconConfig, TraceReplayEngine};
46
use qc_simulate::synthetic::{self, SyntheticConfig};
57

68
fn generate_trace(n: usize) -> Vec<qc_model::trace::RequestTraceEvent> {
@@ -16,7 +18,7 @@ fn generate_trace(n: usize) -> Vec<qc_model::trace::RequestTraceEvent> {
1618
fn bench_lru_replay_1m(c: &mut Criterion) {
1719
let events = generate_trace(1_000_000);
1820

19-
c.bench_function("lru_replay_1m", |b| {
21+
c.bench_function("lru_replay_1m_string", |b| {
2022
b.iter(|| {
2123
let mut policy = LruPolicy::new(50_000_000);
2224
let metrics = TraceReplayEngine::replay(black_box(&events), &mut policy).unwrap();
@@ -25,6 +27,26 @@ fn bench_lru_replay_1m(c: &mut Criterion) {
2527
});
2628
}
2729

30+
fn bench_lru_replay_1m_compact(c: &mut Criterion) {
31+
let events = generate_trace(1_000_000);
32+
let (compact_events, mut interner) = CompactTraceEvent::intern_batch(&events);
33+
let econ =
34+
CompactReplayEconConfig::from_econ_config(&ReplayEconConfig::default(), &mut interner);
35+
36+
c.bench_function("lru_replay_1m_compact", |b| {
37+
b.iter(|| {
38+
let mut policy = CompactLruPolicy::new(50_000_000);
39+
let metrics = TraceReplayEngine::replay_compact_with_econ(
40+
black_box(&compact_events),
41+
&mut policy,
42+
&econ,
43+
)
44+
.unwrap();
45+
black_box(metrics);
46+
})
47+
});
48+
}
49+
2850
fn bench_gdsf_replay_1m(c: &mut Criterion) {
2951
let events = generate_trace(1_000_000);
3052

@@ -37,5 +59,44 @@ fn bench_gdsf_replay_1m(c: &mut Criterion) {
3759
});
3860
}
3961

40-
criterion_group!(benches, bench_lru_replay_1m, bench_gdsf_replay_1m);
62+
fn bench_intern_batch_1m(c: &mut Criterion) {
63+
let events = generate_trace(1_000_000);
64+
65+
c.bench_function("intern_batch_1m", |b| {
66+
b.iter(|| {
67+
let (compact, interner) = CompactTraceEvent::intern_batch(black_box(&events));
68+
black_box((compact, interner));
69+
})
70+
});
71+
}
72+
73+
fn bench_memory_comparison(c: &mut Criterion) {
74+
let events = generate_trace(100_000);
75+
76+
c.bench_function("memory_string_100k", |b| {
77+
b.iter(|| {
78+
let e = events.clone();
79+
black_box(e.len());
80+
})
81+
});
82+
83+
let (compact_events, interner) = CompactTraceEvent::intern_batch(&events);
84+
85+
c.bench_function("memory_compact_100k", |b| {
86+
b.iter(|| {
87+
let e = compact_events.clone();
88+
let i = interner.clone();
89+
black_box((e.len(), i.len()));
90+
})
91+
});
92+
}
93+
94+
criterion_group!(
95+
benches,
96+
bench_lru_replay_1m,
97+
bench_lru_replay_1m_compact,
98+
bench_gdsf_replay_1m,
99+
bench_intern_batch_1m,
100+
bench_memory_comparison
101+
);
41102
criterion_main!(benches);

0 commit comments

Comments
 (0)