Move to `bencher`
jump to
@@ -38,7 +38,7 @@ ark-bls12-381 = { path = "../bls12_381", optional = true }
ark-ed-on-bls12-381 = { path = "../ed_on_bls12_381", optional = true } ark-bw6-761 = { path = "../bw6_761", optional = true } ark-cp6-782 = { path = "../cp6_782", optional = true } -criterion = { version = "0.3", optional = true } +bencher = { version = "0.1.5" } paste = { version = "1.0" } rand = "0.7"
@@ -31,4 +31,4 @@ f_bench!(target, Fq12, Fq12, fq12);
pairing_bench!(Bls12_377, Fq12); -criterion::criterion_main!(g1::group_ops, g2::group_ops, fq, fr, fq2, fq12, pairing); +bencher::benchmark_main!(g1::group_ops, g2::group_ops, fq, fr, fq2, fq12, pairing);
@@ -31,4 +31,4 @@ f_bench!(target, Fq12, Fq12, fq12);
pairing_bench!(Bls12_381, Fq12); -criterion::criterion_main!(g1::group_ops, g2::group_ops, fq, fr, fq2, fq12, pairing); +bencher::benchmark_main!(g1::group_ops, g2::group_ops, fq, fr, fq2, fq12, pairing);
@@ -31,4 +31,4 @@ f_bench!(target, Fq12, Fq12, fq12);
pairing_bench!(Bn254, Fq12); -criterion::criterion_main!(g1::group_ops, g2::group_ops, fq, fr, fq2, fq12, pairing); +bencher::benchmark_main!(g1::group_ops, g2::group_ops, fq, fr, fq2, fq12, pairing);
@@ -30,4 +30,4 @@ f_bench!(Fq, Fq, FqRepr, FqRepr, fq);
f_bench!(Fr, Fr, FrRepr, FrRepr, fr); pairing_bench!(BW6_761, Fq6); -criterion::criterion_main!(g1::group_ops, g2::group_ops, fq, fr, fq3, fq6, pairing); +bencher::benchmark_main!(g1::group_ops, g2::group_ops, fq, fr, fq3, fq6, pairing);
@@ -28,4 +28,4 @@ f_bench!(Fq, Fq, FqRepr, FqRepr, fq);
f_bench!(Fr, Fr, FrRepr, FrRepr, fr); pairing_bench!(CP6_782, Fq6); -criterion::criterion_main!(g1::group_ops, g2::group_ops, fq, fr, fq3, fq6, pairing); +bencher::benchmark_main!(g1::group_ops, g2::group_ops, fq, fr, fq3, fq6, pairing);
@@ -18,4 +18,4 @@
f_bench!(Fq, Fq, FqRepr, FqRepr, fq); f_bench!(Fr, Fr, FrRepr, FrRepr, fr); -criterion::criterion_main!(g::group_ops, fq, fr); +bencher::benchmark_main!(g::group_ops, fq, fr);
@@ -30,4 +30,4 @@ f_bench!(Fq, Fq, FqRepr, FqRepr, fq);
f_bench!(Fr, Fr, FqRepr, FqRepr, fr); pairing_bench!(MNT4_298, Fq4); -criterion::criterion_main!(g1::group_ops, g2::group_ops, fq, fr, fq2, fq4, pairing); +bencher::benchmark_main!(g1::group_ops, g2::group_ops, fq, fr, fq2, fq4, pairing);
@@ -30,4 +30,4 @@ f_bench!(Fq, Fq, FqRepr, FqRepr, fq);
f_bench!(Fr, Fr, FqRepr, FqRepr, fr); pairing_bench!(MNT4_753, Fq4); -criterion::criterion_main!(g1::group_ops, g2::group_ops, fq, fr, fq2, fq4, pairing); +bencher::benchmark_main!(g1::group_ops, g2::group_ops, fq, fr, fq2, fq4, pairing);
@@ -30,4 +30,4 @@ f_bench!(Fq, Fq, FqRepr, FqRepr, fq);
f_bench!(Fr, Fr, FqRepr, FqRepr, fr); pairing_bench!(MNT6_298, Fq6); -criterion::criterion_main!(g1::group_ops, g2::group_ops, fq, fr, fq3, fq6, pairing); +bencher::benchmark_main!(g1::group_ops, g2::group_ops, fq, fr, fq3, fq6, pairing);
@@ -30,4 +30,4 @@ f_bench!(Fq, Fq, FqRepr, FqRepr, fq);
f_bench!(Fr, Fr, FqRepr, FqRepr, fr); pairing_bench!(MNT6_753, Fq6); -criterion::criterion_main!(g1::group_ops, g2::group_ops, fq, fr, fq3, fq6, pairing); +bencher::benchmark_main!(g1::group_ops, g2::group_ops, fq, fr, fq3, fq6, pairing);
@@ -3,10 +3,9 @@ #[macro_use]
pub mod macros; pub use macros::*; -#[cfg(feature = "criterion")] #[macro_use] -pub extern crate criterion; -pub use criterion::*; +pub extern crate bencher; +pub use bencher::*; #[macro_use] pub extern crate paste;
@@ -1,26 +1,13 @@
#[macro_export] macro_rules! ec_bench { ($projective:ty, $affine:ty) => { - fn bench_curve(c: &mut $crate::criterion::Criterion) { - let mut group = c.benchmark_group("Group operation benchmarks for ".to_string() + core::stringify!($projective)); - group.bench_function("Rand", rand); - group.bench_function("MulAssign", mul_assign); - group.bench_function("AddAssign", add_assign); - group.bench_function("AddAssignMixed", add_assign_mixed); - group.bench_function("Serialize w/ compression", ser); - group.bench_function("Deserialize w/ compression", deser); - group.bench_function("Serialize unchecked", ser_unchecked); - group.bench_function("Deserialize unchecked", deser_unchecked); - } - - - fn rand(b: &mut $crate::criterion::Bencher) { + fn rand(b: &mut $crate::bencher::Bencher) { let mut rng = XorShiftRng::seed_from_u64(1231275789u64); b.iter(|| <$projective>::rand(&mut rng)); } - fn mul_assign(b: &mut $crate::criterion::Bencher) { + fn mul_assign(b: &mut $crate::bencher::Bencher) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::seed_from_u64(1231275789u64);@@ -39,7 +26,7 @@ });
} - fn add_assign(b: &mut $crate::criterion::Bencher) { + fn add_assign(b: &mut $crate::bencher::Bencher) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::seed_from_u64(1231275789u64);@@ -58,7 +45,7 @@ });
} - fn add_assign_mixed(b: &mut $crate::criterion::Bencher) { + fn add_assign_mixed(b: &mut $crate::bencher::Bencher) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::seed_from_u64(1231275789u64);@@ -82,7 +69,7 @@ });
} - fn double(b: &mut $crate::criterion::Bencher) { + fn double(b: &mut $crate::bencher::Bencher) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::seed_from_u64(1231275789u64);@@ -101,7 +88,7 @@ });
} - fn deser(b: &mut $crate::criterion::Bencher) { + fn deser(b: &mut $crate::bencher::Bencher) { use ark_ec::ProjectiveCurve; use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; const SAMPLES: usize = 1000;@@ -128,7 +115,7 @@ });
} - fn ser(b: &mut $crate::criterion::Bencher) { + fn ser(b: &mut $crate::bencher::Bencher) { use ark_ec::ProjectiveCurve; use ark_serialize::CanonicalSerialize; const SAMPLES: usize = 1000;@@ -151,7 +138,7 @@ });
} - fn deser_unchecked(b: &mut $crate::criterion::Bencher) { + fn deser_unchecked(b: &mut $crate::bencher::Bencher) { use ark_ec::ProjectiveCurve; use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; const SAMPLES: usize = 1000;@@ -178,7 +165,7 @@ });
} - fn ser_unchecked(b: &mut $crate::criterion::Bencher) { + fn ser_unchecked(b: &mut $crate::bencher::Bencher) { use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; const SAMPLES: usize = 1000;@@ -199,13 +186,16 @@ tmp.serialize_unchecked(&mut bytes)
}); } - $crate::criterion::criterion_group!( - name = group_ops; - config = $crate::criterion::Criterion::default() - .sample_size(10) - .warm_up_time(core::time::Duration::from_millis(500)) - .measurement_time(core::time::Duration::from_secs(1)); - targets = bench_curve, + $crate::bencher::benchmark_group!( + group_ops, + rand, + mul_assign, + add_assign, + add_assign_mixed, + ser, + deser, + ser_unchecked, + deser_unchecked, ); }; }
@@ -8,8 +8,33 @@ use super::*;
field_common!($f, $f_type); sqrt!($f, $f_type); prime_field!($f, $f_type, $f_repr, $f_repr_type); + $crate::bencher::benchmark_group!( + $modname, + // common stuff + add_assign, + sub_assign, + double, + negate, + mul_assign, + square, + inverse, + ser, + deser, + ser_unchecked, + deser_unchecked, + // sqrt field stuff + sqrt, + // prime field stuff + repr_add_nocarry, + repr_sub_noborrow, + repr_num_bits, + repr_mul2, + repr_div2, + into_repr, + from_repr, + ); } - $crate::criterion::criterion_group!($modname, [<_ $modname>]::bench_common_field_ops, [<_ $modname>]::bench_sqrt, [<_ $modname>]::bench_prime_field_ops); + use [<_ $modname>]::$modname; } }; // use this for intermediate fields@@ -19,8 +44,25 @@ mod [<_ $modname>] {
use super::*; field_common!($f, $f_type); sqrt!($f, $f_type); + $crate::bencher::benchmark_group!( + $modname, + // common stuff + add_assign, + sub_assign, + double, + negate, + mul_assign, + square, + inverse, + ser, + deser, + ser_unchecked, + deser_unchecked, + // sqrt field stuff + sqrt, + ); } - $crate::criterion::criterion_group!($modname, [<_ $modname>]::bench_common_field_ops, [<_ $modname>]::bench_sqrt); + use [<_ $modname>]::$modname; } }; // Use this for the full extension field Fqk@@ -29,8 +71,23 @@ crate::paste! {
mod [<_ $modname>] { use super::*; field_common!($f, $f_type); + $crate::bencher::benchmark_group!( + $modname, + // common stuff + add_assign, + sub_assign, + double, + negate, + mul_assign, + square, + inverse, + ser, + deser, + ser_unchecked, + deser_unchecked, + ); } - $crate::criterion::criterion_group!($modname, [<_ $modname>]::bench_common_field_ops); + use [<_ $modname>]::$modname; } }; }@@ -38,22 +95,7 @@
#[macro_export] macro_rules! field_common { ($f:ident, $f_type:ty) => { - pub fn bench_common_field_ops(c: &mut $crate::criterion::Criterion) { - let mut group = c.benchmark_group("Common field operations for ".to_string() + core::stringify!($f)); - group.bench_function("AddAssign", add_assign); - group.bench_function("SubAssign", sub_assign); - group.bench_function("Double", double); - group.bench_function("Negate", negate); - group.bench_function("MulAssign", mul_assign); - group.bench_function("Square", square); - group.bench_function("Inverse", inverse); - group.bench_function("Serialize w/ compression", ser); - group.bench_function("Deserialize w/ compression", deser); - group.bench_function("Serialize unchecked", ser_unchecked); - group.bench_function("Deserialize unchecked", deser_unchecked); - } - - fn add_assign(b: &mut $crate::criterion::Bencher) { + fn add_assign(b: &mut $crate::bencher::Bencher) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::seed_from_u64(1231275789u64);@@ -72,7 +114,7 @@ });
} - fn sub_assign(b: &mut $crate::criterion::Bencher) { + fn sub_assign(b: &mut $crate::bencher::Bencher) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::seed_from_u64(1231275789u64);@@ -90,7 +132,7 @@ tmp
}); } - fn double(b: &mut $crate::criterion::Bencher) { + fn double(b: &mut $crate::bencher::Bencher) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::seed_from_u64(1231275789u64);@@ -107,7 +149,7 @@ });
} - fn negate(b: &mut $crate::criterion::Bencher) { + fn negate(b: &mut $crate::bencher::Bencher) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::seed_from_u64(1231275789u64);@@ -123,7 +165,7 @@ tmp
}); } - fn mul_assign(b: &mut $crate::criterion::Bencher) { + fn mul_assign(b: &mut $crate::bencher::Bencher) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::seed_from_u64(1231275789u64);@@ -141,7 +183,7 @@ tmp
}); } - fn square(b: &mut $crate::criterion::Bencher) { + fn square(b: &mut $crate::bencher::Bencher) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::seed_from_u64(1231275789u64);@@ -158,7 +200,7 @@ });
} - fn inverse(b: &mut $crate::criterion::Bencher) { + fn inverse(b: &mut $crate::bencher::Bencher) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::seed_from_u64(1231275789u64);@@ -174,7 +216,7 @@ });
} - fn deser(b: &mut $crate::criterion::Bencher) { + fn deser(b: &mut $crate::bencher::Bencher) { use ark_serialize::{CanonicalSerialize, CanonicalDeserialize}; const SAMPLES: usize = 1000;@@ -198,7 +240,7 @@ });
} - fn ser(b: &mut $crate::criterion::Bencher) { + fn ser(b: &mut $crate::bencher::Bencher) { use ark_serialize::CanonicalSerialize; const SAMPLES: usize = 1000;@@ -218,7 +260,7 @@ });
} - fn deser_unchecked(b: &mut $crate::criterion::Bencher) { + fn deser_unchecked(b: &mut $crate::bencher::Bencher) { use ark_serialize::{CanonicalSerialize, CanonicalDeserialize}; const SAMPLES: usize = 1000;@@ -242,7 +284,7 @@ });
} - fn ser_unchecked(b: &mut $crate::criterion::Bencher) { + fn ser_unchecked(b: &mut $crate::bencher::Bencher) { use ark_serialize::CanonicalSerialize; const SAMPLES: usize = 1000;@@ -266,7 +308,7 @@
#[macro_export] macro_rules! sqrt { ($f:ident, $f_type:ty) => { - pub fn bench_sqrt(b: &mut $crate::criterion::Criterion) { + pub fn sqrt(b: &mut $crate::bencher::Bencher) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::seed_from_u64(1231275789u64);@@ -280,11 +322,9 @@ })
.collect(); let mut count = 0; - b.bench_function( - core::concat!("Square-roots for ", core::stringify!($f)), - |_| { + b.iter(|| { count = (count + 1) % SAMPLES; - let _ = v[count].sqrt(); + v[count].sqrt() }); } }@@ -293,18 +333,7 @@
#[macro_export] macro_rules! prime_field { ($f:ident, $f_type:ty, $f_repr:ident, $f_repr_type:ty) => { - pub fn bench_prime_field_ops(c: &mut $crate::criterion::Criterion) { - let mut group = c.benchmark_group("Prime field operations for ".to_string() + core::stringify!($f)); - group.bench_function("AddNoCarry for BigInteger", repr_add_nocarry); - group.bench_function("SubNoBorrow for BigInteger", repr_sub_noborrow); - group.bench_function("NumBits for BigInteger", repr_num_bits); - group.bench_function("MulBy2 for BigInteger", repr_mul2); - group.bench_function("DivBy2 for BigInteger", repr_div2); - group.bench_function("Into BigInteger", into_repr); - group.bench_function("From BigInteger", from_repr); - } - - fn repr_add_nocarry(b: &mut $crate::criterion::Bencher) { + fn repr_add_nocarry(b: &mut $crate::bencher::Bencher) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::seed_from_u64(1231275789u64);@@ -331,7 +360,7 @@ tmp
}); } - fn repr_sub_noborrow(b: &mut $crate::criterion::Bencher) { + fn repr_sub_noborrow(b: &mut $crate::bencher::Bencher) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::seed_from_u64(1231275789u64);@@ -357,7 +386,7 @@ tmp;
}); } - fn repr_num_bits(b: &mut $crate::criterion::Bencher) { + fn repr_num_bits(b: &mut $crate::bencher::Bencher) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::seed_from_u64(1231275789u64);@@ -372,7 +401,7 @@ tmp;
}); } - fn repr_mul2(b: &mut $crate::criterion::Bencher) { + fn repr_mul2(b: &mut $crate::bencher::Bencher) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::seed_from_u64(1231275789u64);@@ -388,7 +417,7 @@ tmp;
}); } - fn repr_div2(b: &mut $crate::criterion::Bencher) { + fn repr_div2(b: &mut $crate::bencher::Bencher) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::seed_from_u64(1231275789u64);@@ -404,7 +433,7 @@ tmp;
}); } - fn into_repr(b: &mut $crate::criterion::Bencher) { + fn into_repr(b: &mut $crate::bencher::Bencher) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::seed_from_u64(1231275789u64);@@ -418,7 +447,7 @@ v[count].into_repr();
}); } - fn from_repr(b: &mut $crate::criterion::Bencher) { + fn from_repr(b: &mut $crate::bencher::Bencher) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::seed_from_u64(1231275789u64);
@@ -1,15 +1,7 @@
#[macro_export] macro_rules! pairing_bench { ($curve:ident, $pairing_field:ident) => { - - fn bench_pairing(c: &mut $crate::criterion::Criterion) { - let mut group = c.benchmark_group("Pairing for ".to_string() + core::stringify!($curve)); - group.bench_function("Miller Loop", miller_loop); - group.bench_function("Final Exponentiation", final_exponentiation); - group.bench_function("Full Pairing", full_pairing); - } - - fn miller_loop(b: &mut $crate::criterion::Bencher) { + fn miller_loop(b: &mut $crate::bencher::Bencher) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::seed_from_u64(1231275789u64);@@ -32,7 +24,7 @@ });
} - fn final_exponentiation(b: &mut $crate::criterion::Bencher) { + fn final_exponentiation(b: &mut $crate::bencher::Bencher) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::seed_from_u64(1231275789u64);@@ -56,7 +48,7 @@ });
} - fn full_pairing(b: &mut $crate::criterion::Bencher) { + fn full_pairing(b: &mut $crate::bencher::Bencher) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::seed_from_u64(1231275789u64);@@ -73,13 +65,11 @@ tmp
}); } - $crate::criterion::criterion_group!( - name = pairing; - config = $crate::criterion::Criterion::default() - .sample_size(10) - .warm_up_time(core::time::Duration::from_millis(500)) - .measurement_time(core::time::Duration::from_secs(1)); - targets = bench_pairing, + $crate::bencher::benchmark_group!( + pairing, + miller_loop, + final_exponentiation, + full_pairing, ); } }