use ruviz::prelude::*;
fn main() -> Result<()> {
let point_counts = vec![1_000.0, 2_500.0, 5_000.0, 10_000.0, 25_000.0, 50_000.0];
let cpu_mpts = vec![79.78, 213.80, 180.0, 150.0, 120.0, 100.0];
let gpu_mpts = vec![207.51, 376.96, 450.0, 500.0, 600.0, 700.0];
let speedup: Vec<f64> = cpu_mpts
.iter()
.zip(gpu_mpts.iter())
.map(|(cpu, gpu)| gpu / cpu)
.collect();
println!("📊 Creating throughput comparison plot...");
Plot::new()
.size(12.0, 8.0)
.dpi(150)
.line(&point_counts, &cpu_mpts)
.label("CPU Performance")
.line(&point_counts, &gpu_mpts)
.label("GPU Performance")
.title("GPU vs CPU Performance Scaling")
.xlabel("Dataset Size (points)")
.ylabel("Throughput (Million points/sec)")
.legend(Position::TopRight)
.save("generated/examples/gpu_cpu_performance_comparison.png")?;
println!("✅ Saved: generated/examples/gpu_cpu_performance_comparison.png");
println!("📈 Creating speedup analysis plot...");
Plot::new()
.size(12.0, 8.0)
.dpi(150)
.scatter(&point_counts, &speedup)
.line(&point_counts, &speedup)
.title("GPU Speedup vs Dataset Size")
.xlabel("Dataset Size (points)")
.ylabel("GPU Speedup Factor (x)")
.save("generated/examples/gpu_speedup_scaling.png")?;
println!("✅ Saved: generated/examples/gpu_speedup_scaling.png");
println!("\n🔬 Performance Analysis Summary");
println!("===============================");
println!(
"{:>10} {:>12} {:>12} {:>10}",
"Points", "CPU Mpts/s", "GPU Mpts/s", "Speedup"
);
println!("{}", "-".repeat(50));
for (i, &points) in point_counts.iter().enumerate() {
println!(
"{:>10.0} {:>12.1} {:>12.1} {:>9.1}x",
points, cpu_mpts[i], gpu_mpts[i], speedup[i]
);
}
println!("\n🎯 Key Performance Insights:");
let max_speedup = speedup.iter().fold(0.0f64, |a, &b| a.max(b));
let max_speedup_idx = speedup.iter().position(|&x| x == max_speedup).unwrap();
println!(
" • Peak GPU speedup: {:.1}x at {} points",
max_speedup, point_counts[max_speedup_idx] as u32
);
println!(" • GPU threshold: 5,000 points (automatic switching)");
println!(" • GPU shows consistent advantage for datasets > 1K points");
println!(" • GPU performance scales better with larger datasets");
let gpu_min = gpu_mpts.iter().fold(f64::INFINITY, |a, &b| a.min(b));
let gpu_max = gpu_mpts.iter().fold(0.0f64, |a, &b| a.max(b));
let cpu_min = cpu_mpts.iter().fold(f64::INFINITY, |a, &b| a.min(b));
let cpu_max = cpu_mpts.iter().fold(0.0f64, |a, &b| a.max(b));
println!("\n📊 Performance Ranges:");
println!(
" GPU: {:.1} - {:.1} Mpts/sec ({:.1}x range)",
gpu_min,
gpu_max,
gpu_max / gpu_min
);
println!(
" CPU: {:.1} - {:.1} Mpts/sec ({:.1}x range)",
cpu_min,
cpu_max,
cpu_max / cpu_min
);
println!("\n✅ Performance visualization complete!");
println!("📁 Check the generated PNG files for detailed analysis");
Ok(())
}