use rustfft::FftPlanner;
use scirs2_fft::{fft, get_global_cache, init_global_cache};
use std::time::{Duration, Instant};
#[allow(dead_code)]
fn main() {
init_global_cache(64, Duration::from_secs(300)).ok();
let sizes = vec![128, 256, 512, 1024, 2048];
let num_iterations = 100;
println!("FFT Plan Caching Demonstration");
println!("==============================");
println!();
for &size in &sizes {
println!("FFT size: {size}");
let signal: Vec<f64> = (0..size).map(|i| i as f64).collect();
let start = Instant::now();
for _ in 0..num_iterations {
let _ = fft(&signal, None).expect("Operation failed");
}
let cold_duration = start.elapsed();
let start = Instant::now();
for _ in 0..num_iterations {
let _ = fft(&signal, None).expect("Operation failed");
}
let warm_duration = start.elapsed();
let speedup = cold_duration.as_secs_f64() / warm_duration.as_secs_f64();
println!(" Cold cache: {cold_duration:?} for {num_iterations} iterations");
println!(" Warm cache: {warm_duration:?} for {num_iterations} iterations");
println!(" Speedup: {speedup:.2}x");
println!();
}
let cache = get_global_cache();
let stats = cache.get_stats();
println!("Cache Statistics:");
println!("{stats}");
println!();
println!("Pre-computing common sizes...");
let commonsizes = vec![128, 256, 512, 1024];
cache.clear();
let mut planner = FftPlanner::new();
cache.precompute_common_sizes(&commonsizes, &mut planner);
let stats = cache.get_stats();
println!("After pre-computing: {stats}");
let signal_128: Vec<f64> = vec![1.0; 128];
let _ = fft(&signal_128, None).expect("Operation failed");
let stats = cache.get_stats();
println!("After using pre-computed plan: {stats}");
}