impl JitAwareBenchmark {
pub fn analyze(samples: &[f64]) -> Self {
let detector = WarmupDetector::default_detector();
let raw_stats = ThroughputWithVariance::from_samples(samples);
let warmup_result = detector.detect_warmup(samples);
let filtered_stats = warmup_result.steady_state_stats();
let improvement = if raw_stats.mean_tps > 0.0 {
((filtered_stats.mean_tps - raw_stats.mean_tps) / raw_stats.mean_tps) * 100.0
} else {
0.0
};
Self {
detector,
raw_stats,
filtered_stats,
warmup_result,
improvement_percent: improvement,
}
}
pub fn filtering_significant(&self) -> bool {
self.warmup_result.warmup_detected && self.improvement_percent.abs() > 5.0
}
}
#[test]
fn test_imp_161b_jit_aware_benchmark() {
let samples = vec![
40.0, 60.0, 80.0, 90.0, 95.0, 100.0, 98.0, 102.0, 99.0, 101.0, 100.0, 99.0, 101.0, 100.0, 98.0, ];
let analysis = JitAwareBenchmark::analyze(&samples);
assert!(
analysis.filtered_stats.mean_tps > analysis.raw_stats.mean_tps,
"IMP-161b: Filtered mean should be higher after removing warmup"
);
assert!(
analysis.improvement_percent > 5.0,
"IMP-161b: Should show >5% improvement, got {:.2}%",
analysis.improvement_percent
);
assert!(
analysis.filtering_significant(),
"IMP-161b: JIT filtering should be significant"
);
println!("\nIMP-161b: JIT-Aware Benchmark:");
println!(
" Raw mean: {:.2} tok/s (n={})",
analysis.raw_stats.mean_tps, analysis.raw_stats.sample_count
);
println!(
" Filtered mean: {:.2} tok/s (n={})",
analysis.filtered_stats.mean_tps, analysis.filtered_stats.sample_count
);
println!(" Improvement: {:.2}%", analysis.improvement_percent);
println!(
" Warmup removed: {} iterations",
analysis.warmup_result.warmup_iterations
);
println!(
" Filtering significant: {}",
analysis.filtering_significant()
);
}
#[derive(Debug, Clone)]
pub struct ColdWarmComparison {
pub cold_latency_ms: f64,
pub warm_latency_ms: f64,
pub cold_penalty_ratio: f64,
pub significant_cold_penalty: bool,
}
impl ColdWarmComparison {
pub fn analyze(latencies: &[f64]) -> Self {
if latencies.is_empty() {
return Self {
cold_latency_ms: 0.0,
warm_latency_ms: 0.0,
cold_penalty_ratio: 1.0,
significant_cold_penalty: false,
};
}
let cold_latency = latencies[0];
let warm_latency = if latencies.len() > 1 {
latencies[1..].iter().sum::<f64>() / (latencies.len() - 1) as f64
} else {
cold_latency
};
let penalty_ratio = if warm_latency > 0.0 {
cold_latency / warm_latency
} else {
1.0
};
Self {
cold_latency_ms: cold_latency,
warm_latency_ms: warm_latency,
cold_penalty_ratio: penalty_ratio,
significant_cold_penalty: penalty_ratio > 2.0,
}
}
}
#[test]
fn test_imp_161c_cold_warm_detection() {
let latencies = vec![
500.0, 100.0, 105.0, 98.0, 102.0, 99.0, 101.0, 100.0, 103.0, 97.0, ];
let analysis = ColdWarmComparison::analyze(&latencies);
assert!(
(analysis.cold_latency_ms - 500.0).abs() < 1.0,
"IMP-161c: Cold latency should be 500ms, got {:.2}",
analysis.cold_latency_ms
);
assert!(
(analysis.warm_latency_ms - 100.5).abs() < 5.0,
"IMP-161c: Warm latency should be ~100ms, got {:.2}",
analysis.warm_latency_ms
);
assert!(
analysis.significant_cold_penalty,
"IMP-161c: Cold start penalty should be significant"
);
assert!(
analysis.cold_penalty_ratio > 4.0 && analysis.cold_penalty_ratio < 6.0,
"IMP-161c: Cold penalty ratio should be ~5x, got {:.2}x",
analysis.cold_penalty_ratio
);
println!("\nIMP-161c: Cold/Warm Start Detection:");
println!(" Cold start latency: {:.2} ms", analysis.cold_latency_ms);
println!(" Warm average latency: {:.2} ms", analysis.warm_latency_ms);
println!(" Cold penalty ratio: {:.2}x", analysis.cold_penalty_ratio);
println!(
" Significant penalty: {}",
analysis.significant_cold_penalty
);
}
#[test]
#[ignore = "Requires running llama.cpp server on port 8082"]
fn test_imp_161d_realworld_warmup_detection() {
let client = ModelHttpClient::with_timeout(60);
let request = CompletionRequest {
model: "default".to_string(),
prompt: "Say hello:".to_string(),
max_tokens: 10,
temperature: Some(0.0),
stream: false,
};
let mut latencies_ms = Vec::new();
for _ in 0..15 {
let start = std::time::Instant::now();
if client
.llamacpp_completion("http://127.0.0.1:8082", &request)
.is_ok()
{
latencies_ms.push(start.elapsed().as_secs_f64() * 1000.0);
}
}
if latencies_ms.len() < 10 {
println!("IMP-161d: Not enough samples collected");
return;
}
let throughputs: Vec<f64> = latencies_ms
.iter()
.map(|lat| if *lat > 0.0 { 10000.0 / lat } else { 0.0 }) .collect();
let analysis = JitAwareBenchmark::analyze(&throughputs);
let cold_warm = ColdWarmComparison::analyze(&latencies_ms);
println!("\nIMP-161d: Real-World Warmup Detection (llama.cpp):");
println!(" Samples collected: {}", latencies_ms.len());
println!(" Raw mean: {:.2} tok/s", analysis.raw_stats.mean_tps);
println!(
" Filtered mean: {:.2} tok/s",
analysis.filtered_stats.mean_tps
);
println!(
" Warmup iterations: {}",
analysis.warmup_result.warmup_iterations
);
println!(
" Filtering improvement: {:.2}%",
analysis.improvement_percent
);
println!(" Cold start latency: {:.2} ms", cold_warm.cold_latency_ms);
println!(" Warm latency: {:.2} ms", cold_warm.warm_latency_ms);
println!(" Cold penalty: {:.2}x", cold_warm.cold_penalty_ratio);
}