use avila_parallel::prelude::*;
use avila_parallel::executor;
fn main() {
println!("=== Advanced Configuration Demo ===\n");
println!("System Configuration:");
println!(" CPU cores: {}", executor::num_cpus());
println!(" Min chunk size: {}", executor::get_min_chunk_size());
println!();
println!("1. Default Configuration:");
let data: Vec<i32> = (0..100_000).collect();
let start = std::time::Instant::now();
let sum: i32 = data.par_iter().sum();
let elapsed = start.elapsed();
println!(" Sum of 100K elements: {}", sum);
println!(" Time: {:?}", elapsed);
println!();
println!("2. Custom Configuration (via env var):");
println!(" Try running with: AVILA_MIN_CHUNK_SIZE=2048 cargo run --example configuration");
println!();
println!("3. Chunk Size Calculation:");
for size in [1_000, 10_000, 100_000, 1_000_000] {
let num_threads = executor::num_cpus();
let chunk_size = executor::calculate_chunk_size(size, num_threads);
let num_chunks = (size + chunk_size - 1) / chunk_size;
println!(" Dataset: {:>7} → Chunk size: {:>6}, Chunks: {:>4}",
size, chunk_size, num_chunks);
}
println!();
println!("4. Workload Analysis:");
let start = std::time::Instant::now();
let _light: Vec<_> = data.par_vec().map(|x| x * 2).collect();
let light_time = start.elapsed();
println!(" Light workload (x*2): {:?}", light_time);
let start = std::time::Instant::now();
let _medium: Vec<_> = data.par_vec()
.map(|&x| {
let mut val = x;
for _ in 0..10 {
val = (val * 31 + 17) % 1_000_000;
}
val
})
.collect();
let medium_time = start.elapsed();
println!(" Medium workload (10 ops): {:?}", medium_time);
let start = std::time::Instant::now();
let _heavy: Vec<_> = data.par_vec()
.map(|&x| {
let mut val = x;
for _ in 0..100 {
val = (val * 31 + 17) % 1_000_000;
}
val
})
.collect();
let heavy_time = start.elapsed();
println!(" Heavy workload (100 ops): {:?}", heavy_time);
println!();
println!("5. Configuration Recommendations:");
println!();
println!(" Light workloads (< 10µs per element):");
println!(" → Increase chunk size: AVILA_MIN_CHUNK_SIZE=2048");
println!(" → Or use sequential processing");
println!();
println!(" Medium workloads (10-100µs per element):");
println!(" → Default works well: 1024 (current)");
println!();
println!(" Heavy workloads (> 100µs per element):");
println!(" → Decrease chunk size: AVILA_MIN_CHUNK_SIZE=512");
println!(" → Better load distribution");
println!();
println!("6. Early Termination (Find Operation):");
let large_data: Vec<i32> = (0..1_000_000).collect();
let start = std::time::Instant::now();
let found = executor::parallel_find(&large_data, |x| *x == 1000);
let early_time = start.elapsed();
println!(" Find element 1000: {:?} in {:?}", found, early_time);
let start = std::time::Instant::now();
let found = executor::parallel_find(&large_data, |x| *x == 999_000);
let late_time = start.elapsed();
println!(" Find element 999000: {:?} in {:?}", found, late_time);
println!();
println!("=== Demo Complete ===");
println!();
println!("Try these commands:");
println!(" AVILA_MIN_CHUNK_SIZE=512 cargo run --example configuration --release");
println!(" AVILA_MIN_CHUNK_SIZE=2048 cargo run --example configuration --release");
}