use subms_hdr_histogram::HdrHistogram;
fn main() {
base_tick_to_trade();
#[cfg(feature = "concurrent-writes")]
concurrent_feed_handlers();
#[cfg(feature = "dual-recorder")]
dual_recorder_interval_report();
#[cfg(feature = "merge")]
merge_shard_rollup();
#[cfg(feature = "decay")]
decay_recency_weighted();
#[cfg(feature = "value-tagging")]
value_tagging_by_venue();
#[cfg(feature = "iterators")]
iterators_export_bands();
}
fn base_tick_to_trade() {
println!("== base: tick-to-trade latency capture ==");
let mut h = HdrHistogram::new(3);
let mut rng = 0x2545_F491_4F6C_DD1Du64;
let mut next = || {
rng ^= rng << 13;
rng ^= rng >> 7;
rng ^= rng << 17;
rng
};
let n = 2_000u64;
for i in 0..n {
let base = 700 + next() % 300; if i % 50 == 0 {
h.record(4_000 + next() % 4_000); } else {
h.record(base);
}
}
let p50 = h.value_at_percentile(0.50);
let p99 = h.value_at_percentile(0.99);
let p999 = h.value_at_percentile(0.999);
println!(
" n={n} p50={p50}ns p99={p99}ns p999={p999}ns max={}ns",
h.max()
);
assert_eq!(h.count(), n, "every sample recorded");
assert!(
p50 <= 1_100,
"median sits in the steady-state band: p50={p50}"
);
assert!(
p99 >= 2_000,
"the 2% tail lifts p99 well past the median: p99={p99}"
);
assert!(p999 >= p99 && h.max() >= p999, "percentiles are monotone");
let mut naive = HdrHistogram::new(3);
let mut corrected = HdrHistogram::new(3);
for _ in 0..1_000 {
naive.record(10);
corrected.record_with_expected_interval(10, 10);
}
naive.record(1_000);
corrected.record_with_expected_interval(1_000, 10);
let naive_p99 = naive.value_at_percentile(0.99);
let corrected_p99 = corrected.value_at_percentile(0.99);
println!(" coordinated omission: naive p99={naive_p99}ns, corrected p99={corrected_p99}ns");
assert!(
naive_p99 <= 20,
"uncorrected tail hides the stall: {naive_p99}"
);
assert!(
corrected_p99 >= 500,
"correction lifts the tail: {corrected_p99}"
);
}
#[cfg(feature = "concurrent-writes")]
fn concurrent_feed_handlers() {
use std::sync::Arc;
use std::thread;
use subms_hdr_histogram::ConcurrentHdrHistogram;
println!("\n== concurrent-writes: many feed handlers, one histogram ==");
let h = Arc::new(ConcurrentHdrHistogram::new(3));
let threads = 4;
let per_thread = 50_000u64;
let mut handles = vec![];
for _ in 0..threads {
let h = h.clone();
handles.push(thread::spawn(move || {
for i in 0..per_thread {
h.record((i % 1_000) + 500);
}
}));
}
for j in handles {
j.join().unwrap();
}
println!(
" {} records lock-free, p99={}ns",
h.count(),
h.value_at_percentile(0.99)
);
assert_eq!(
h.count(),
threads as u64 * per_thread,
"no writes lost under contention"
);
}
#[cfg(feature = "dual-recorder")]
fn dual_recorder_interval_report() {
use subms_hdr_histogram::DualRecorder;
println!("\n== dual-recorder: lock-free interval percentile report ==");
let rec = DualRecorder::new(3);
for v in 1..=500u64 {
rec.record(v);
}
let interval = rec.get_interval_histogram();
println!(
" interval count={}, p99={}",
interval.count(),
interval.value_at_percentile(0.99)
);
let next = rec.get_interval_histogram();
assert_eq!(
interval.count(),
500,
"first interval captured every record"
);
assert_eq!(
next.count(),
0,
"the next interval starts empty after the rotate"
);
}
#[cfg(feature = "merge")]
fn merge_shard_rollup() {
use subms_hdr_histogram::merge;
println!("\n== merge: roll per-shard histograms into a fleet view ==");
let mut shard_a = HdrHistogram::new(3);
let mut shard_b = HdrHistogram::new(3);
for v in 1..=500u64 {
shard_a.record(v);
}
for v in 501..=1_000u64 {
shard_b.record(v);
}
merge(&mut shard_a, &shard_b).expect("identical shape merges");
println!(
" fleet count={}, p50={}, p99={}",
shard_a.count(),
shard_a.value_at_percentile(0.5),
shard_a.value_at_percentile(0.99)
);
assert_eq!(shard_a.count(), 1_000, "both shards folded in");
assert!(
shard_a.value_at_percentile(0.99) >= 900,
"the high tail came from shard b"
);
}
#[cfg(feature = "decay")]
fn decay_recency_weighted() {
use subms_hdr_histogram::{DecayingHdrHistogram, ManualClock};
println!("\n== decay: recency-weighted p50 forgets an old spike ==");
let clock = ManualClock::new();
let halflife = 1_000_000_000u64; let mut h = DecayingHdrHistogram::new(3, halflife, &clock);
for _ in 0..1_000 {
h.record(5_000); }
clock.advance_ns(halflife * 4); for _ in 0..1_000 {
h.record(800); }
let p50 = h.value_at_percentile(0.5);
println!(" decayed count~{:.0}, p50={p50}ns", h.count());
assert!(
p50 < 2_000,
"recent fast ops dominate the decayed distribution: p50={p50}"
);
}
#[cfg(feature = "value-tagging")]
fn value_tagging_by_venue() {
use subms_hdr_histogram::TaggedHdrHistogram;
println!("\n== value-tagging: slice latency by venue ==");
const COLO: u8 = 0;
const REMOTE: u8 = 1;
let mut h = TaggedHdrHistogram::new(3);
for v in 500..=1_000u64 {
h.record(v, COLO); }
for v in 5_000..=6_000u64 {
h.record(v, REMOTE); }
let p99_colo = h.value_at_percentile_for_tag(0.99, COLO);
let p99_remote = h.value_at_percentile_for_tag(0.99, REMOTE);
println!(" colo p99={p99_colo}ns, remote p99={p99_remote}ns");
assert!(p99_colo < p99_remote, "each venue's tail reads on its own");
}
#[cfg(feature = "iterators")]
fn iterators_export_bands() {
println!("\n== iterators: export the distribution as bands ==");
let mut h = HdrHistogram::new(3);
for v in 1..=1_000u64 {
h.record(v);
}
let bands = h.iter_logarithmic().count();
let quartiles: Vec<u64> = h.iter_percentiles(25.0).map(|e| e.value_lo).collect();
println!(" {bands} log2 bands; quartile lower bounds = {quartiles:?}");
assert!(bands > 0, "the populated range spans at least one band");
assert!(
!quartiles.is_empty(),
"the percentile walk yields quartile buckets"
);
}