Skip to main content

bench/
bench.rs

1//! Search-latency benchmark. Indexes a repository in memory, then times the
2//! search pipeline (the work the < 50 ms target is about — excludes process
3//! startup).
4//!
5//!   cargo run --release --example bench -- /path/to/repo
6//!
7//! Defaults to the current directory.
8
9use std::path::PathBuf;
10use std::time::Instant;
11
12use reference_query::index;
13use reference_query::search;
14use reference_query::store::Store;
15
16const QUERIES: &[&str] = &[
17    "user",
18    "refund",
19    "perform",
20    "corpus",
21    "parse",
22    "normalize",
23    "usr",
24    "config",
25    "client",
26    "rp",
27];
28
29fn main() {
30    let root = PathBuf::from(std::env::args().nth(1).unwrap_or_else(|| ".".into()));
31
32    let mut store = Store::open_in_memory().expect("open store");
33    let stats = index::index_path(&mut store, &root).expect("index");
34    println!(
35        "indexed {} symbols from {} file(s) under {}",
36        stats.symbols,
37        stats.files_indexed,
38        root.display()
39    );
40
41    // warm up
42    for q in QUERIES {
43        let _ = search::search(&store, q, None, &search::ActiveFiles::default(), 10);
44    }
45
46    let mut times_us: Vec<u128> = Vec::new();
47    for _ in 0..200 {
48        for q in QUERIES {
49            let start = Instant::now();
50            let _ = search::search(&store, q, None, &search::ActiveFiles::default(), 10)
51                .expect("search");
52            times_us.push(start.elapsed().as_micros());
53        }
54    }
55    times_us.sort_unstable();
56
57    let pct = |p: f64| times_us[((times_us.len() as f64 - 1.0) * p).round() as usize];
58    println!(
59        "search over {} runs: p50 {} µs   p95 {} µs   max {} µs",
60        times_us.len(),
61        pct(0.50),
62        pct(0.95),
63        times_us[times_us.len() - 1],
64    );
65    let budget_us = 50_000;
66    let over = times_us.iter().filter(|&&t| t > budget_us).count();
67    println!("{}/{} runs exceeded the 50 ms budget", over, times_us.len());
68}