use std::time::Instant;
use fandhe_backend_plugin_compression::compress_body;
fn make_body(size: usize) -> Vec<u8> {
let unit = b"{\"id\":1,\"name\":\"issue-468-bench\",\"note\":\"payload\"} ";
unit.iter().copied().cycle().take(size).collect()
}
fn median_micros(iterations: usize, mut f: impl FnMut()) -> f64 {
let mut samples = Vec::with_capacity(iterations);
for _ in 0..iterations {
let start = Instant::now();
f();
samples.push(start.elapsed().as_secs_f64() * 1_000_000.0);
}
samples.sort_by(|a, b| a.partial_cmp(b).unwrap());
samples[samples.len() / 2]
}
#[tokio::main(flavor = "multi_thread", worker_threads = 4)]
async fn main() {
println!("# イシュー #468 マイクロベンチ結果");
println!();
println!("## compress_body(gzip 圧縮本体、インライン実行時間)");
println!();
println!("| body サイズ | 中央値(µs、100 回) |");
println!("|---|---|");
for size in [
1024usize, 4096, 16384, 32768, 65536, 131072, 262144, 1048576,
] {
let body = make_body(size);
let micros = median_micros(100, || {
let _ = compress_body(&body);
});
println!("| {size} バイト | {micros:.1} |");
}
println!();
println!("## spawn_blocking ディスパッチ往復コスト(no-op クロージャ、1000 回)");
println!();
let mut async_samples = Vec::with_capacity(1000);
for _ in 0..1000 {
let start = Instant::now();
let _ = tokio::task::spawn_blocking(|| ()).await;
async_samples.push(start.elapsed().as_secs_f64() * 1_000_000.0);
}
async_samples.sort_by(|a, b| a.partial_cmp(b).unwrap());
let dispatch_median = async_samples[async_samples.len() / 2];
println!("| 中央値(µs) |");
println!("|---|");
println!("| {dispatch_median:.1} |");
}