use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion}; use rns::modulus::WordOps; use rns::poly::Poly; use rns::ring::Ring; fn ntt(c: &mut Criterion) { fn runner<'a, const INPLACE: bool, const LAZY: bool>( ring: &'a Ring, ) -> Box { let mut a: Poly = ring.new_poly(); for i in 0..a.n() { a.0[i] = i as u64; } if INPLACE { Box::new(move || ring.ntt_inplace::(&mut a)) } else { let mut b: Poly = ring.new_poly(); Box::new(move || ring.ntt::(&a, &mut b)) } } let q: u64 = 0x1fffffffffe00001u64; let mut b: criterion::BenchmarkGroup<'_, criterion::measurement::WallTime> = c.benchmark_group("ntt"); for log_n in 10..17 { let ring = Ring::new(1 << log_n, q, 1); let runners: [(String, Box); 4] = [ (format!("inplace=true/LAZY=true/q={}", q.log2()), { runner::(&ring) }), (format!("inplace=true/LAZY=false/q={}", q.log2()), { runner::(&ring) }), (format!("inplace=false/LAZY=true/q={}", q.log2()), { runner::(&ring) }), (format!("inplace=false/LAZY=false/q={}", q.log2()), { runner::(&ring) }), ]; for (name, mut runner) in runners { let id: BenchmarkId = BenchmarkId::new(name, format!("n={}", 1 << log_n)); b.bench_with_input(id, &(), |b: &mut criterion::Bencher<'_>, _| { b.iter(&mut runner) }); } } } fn intt(c: &mut Criterion) { fn runner<'a, const INPLACE: bool, const LAZY: bool>( ring: &'a Ring, ) -> Box { let mut a: Poly = ring.new_poly(); for i in 0..a.n() { a.0[i] = i as u64; } if INPLACE { Box::new(move || ring.intt_inplace::(&mut a)) } else { let mut b: Poly = ring.new_poly(); Box::new(move || ring.intt::(&a, &mut b)) } } let q: u64 = 0x1fffffffffe00001u64; let mut b: criterion::BenchmarkGroup<'_, criterion::measurement::WallTime> = c.benchmark_group("intt"); for log_n in 10..17 { let ring = Ring::new(1 << log_n, q, 1); let runners: [(String, Box); 4] = [ (format!("inplace=true/LAZY=true/q={}", q.log2()), { runner::(&ring) }), (format!("inplace=true/LAZY=false/q={}", q.log2()), { runner::(&ring) }), (format!("inplace=false/LAZY=true/q={}", q.log2()), { runner::(&ring) }), (format!("inplace=false/LAZY=false/q={}", q.log2()), { runner::(&ring) }), ]; for (name, mut runner) in runners { let id: BenchmarkId = BenchmarkId::new(name, format!("n={}", 1 << log_n)); b.bench_with_input(id, &(), |b: &mut criterion::Bencher<'_>, _| { b.iter(&mut runner) }); } } } criterion_group!(benches, ntt, intt,); criterion_main!(benches);