use tracing::{info, instrument}; use tracing_subscriber::prelude::*; #[instrument] fn fibonacci(n: usize) -> usize { if n < 2 { n } else { fibonacci(n - 1) + fibonacci(n - 2) } } #[instrument] fn fibonacci_parallel(n: usize) -> usize { if n < 20 { fibonacci(n - 1) + fibonacci(n - 2) } else { let (a, b) = rayon::join(|| fibonacci_parallel(n - 1), || fibonacci_parallel(n - 2)); if (a + b) > 1000 { info!("Big number!"); } a + b } } fn main() { rayon::ThreadPoolBuilder::new() .thread_name(|idx| format!("Worker {idx}")) .build_global() .expect("Failed to build thread pool."); let guard = if std::env::args().any(|arg| arg == "--no-trace") { None } else { let (chrome_layer, guard) = tracing_chrome::ChromeLayerBuilder::new() .include_args(true) .build(); tracing_subscriber::registry().with(chrome_layer).init(); Some(guard) }; let before = std::time::Instant::now(); println!("fibonacci_serial(24) -> {}", fibonacci(24)); println!("took {} s", before.elapsed().as_secs_f32()); if let Some(guard) = &guard { guard.start_new(None); } let before = std::time::Instant::now(); println!("fibonacci_parallel(24) -> {}", fibonacci_parallel(24)); println!("took {} s", before.elapsed().as_secs_f32()); if let Some(guard) = &guard { guard.start_new(None); } let before = std::time::Instant::now(); println!("fibonacci_parallel(20) -> {}", fibonacci_parallel(20)); println!("took {} s", before.elapsed().as_secs_f32()); }