|
|
@ -8,13 +8,16 @@ use criterion::Criterion; |
|
|
|
use pairing::bls12_381::Fr; |
|
|
|
use pairing::bls12_381::Fr; |
|
|
|
use threshold_crypto::poly::Poly; |
|
|
|
use threshold_crypto::poly::Poly; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const TEST_DEGREES: [usize; 4] = [5, 10, 20, 40]; |
|
|
|
|
|
|
|
const RNG_SEED: [u32; 4] = [1, 2, 3, 4]; |
|
|
|
|
|
|
|
|
|
|
|
mod poly_benches { |
|
|
|
mod poly_benches { |
|
|
|
use super::*; |
|
|
|
use super::*; |
|
|
|
use rand::Rng; |
|
|
|
use rand::{Rng, SeedableRng, XorShiftRng}; |
|
|
|
|
|
|
|
|
|
|
|
// Benchmarks multiplication of two polynomials.
|
|
|
|
/// Benchmarks multiplication of two polynomials.
|
|
|
|
fn multiplication(c: &mut Criterion) { |
|
|
|
fn multiplication(c: &mut Criterion) { |
|
|
|
let mut rng = rand::thread_rng(); |
|
|
|
let mut rng = XorShiftRng::from_seed(RNG_SEED); |
|
|
|
c.bench_function_over_inputs( |
|
|
|
c.bench_function_over_inputs( |
|
|
|
"Polynomial multiplication", |
|
|
|
"Polynomial multiplication", |
|
|
|
move |b, &°| { |
|
|
|
move |b, &°| { |
|
|
@ -25,27 +28,61 @@ mod poly_benches { |
|
|
|
}; |
|
|
|
}; |
|
|
|
b.iter_with_setup(rand_factors, |(lhs, rhs)| &lhs * &rhs) |
|
|
|
b.iter_with_setup(rand_factors, |(lhs, rhs)| &lhs * &rhs) |
|
|
|
}, |
|
|
|
}, |
|
|
|
&[5, 10, 20, 40], |
|
|
|
&TEST_DEGREES, |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// Benchmarks subtraction of two polynomials
|
|
|
|
|
|
|
|
fn subtraction(c: &mut Criterion) { |
|
|
|
|
|
|
|
let mut rng = XorShiftRng::from_seed(RNG_SEED); |
|
|
|
|
|
|
|
c.bench_function_over_inputs( |
|
|
|
|
|
|
|
"Polynomial subtraction", |
|
|
|
|
|
|
|
move |b, &°| { |
|
|
|
|
|
|
|
let rand_factors = || { |
|
|
|
|
|
|
|
let lhs = Poly::random(deg, &mut rng); |
|
|
|
|
|
|
|
let rhs = Poly::random(deg, &mut rng); |
|
|
|
|
|
|
|
(lhs, rhs) |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
b.iter_with_setup(rand_factors, |(lhs, rhs)| &lhs - &rhs) |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
&TEST_DEGREES, |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// Benchmarks addition of two polynomials
|
|
|
|
|
|
|
|
fn addition(c: &mut Criterion) { |
|
|
|
|
|
|
|
let mut rng = XorShiftRng::from_seed(RNG_SEED); |
|
|
|
|
|
|
|
c.bench_function_over_inputs( |
|
|
|
|
|
|
|
"Polynomial addition", |
|
|
|
|
|
|
|
move |b, &°| { |
|
|
|
|
|
|
|
let rand_factors = || { |
|
|
|
|
|
|
|
let lhs = Poly::random(deg, &mut rng); |
|
|
|
|
|
|
|
let rhs = Poly::random(deg, &mut rng); |
|
|
|
|
|
|
|
(lhs, rhs) |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
b.iter_with_setup(rand_factors, |(lhs, rhs)| &lhs + &rhs) |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
&TEST_DEGREES, |
|
|
|
); |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Benchmarks Lagrange interpolation for a polynomial.
|
|
|
|
/// Benchmarks Lagrange interpolation for a polynomial.
|
|
|
|
fn interpolate(c: &mut Criterion) { |
|
|
|
fn interpolate(c: &mut Criterion) { |
|
|
|
let mut rng = rand::thread_rng(); |
|
|
|
let mut rng = XorShiftRng::from_seed(RNG_SEED); |
|
|
|
c.bench_function_over_inputs( |
|
|
|
c.bench_function_over_inputs( |
|
|
|
"Polynomial interpolation", |
|
|
|
"Polynomial interpolation", |
|
|
|
move |b, &°| { |
|
|
|
move |b, &°| { |
|
|
|
let rand_samples = || (0..=deg).map(|i| (i, rng.gen::<Fr>())).collect::<Vec<_>>(); |
|
|
|
let rand_samples = || (0..=deg).map(|i| (i, rng.gen::<Fr>())).collect::<Vec<_>>(); |
|
|
|
b.iter_with_setup(rand_samples, Poly::interpolate) |
|
|
|
b.iter_with_setup(rand_samples, Poly::interpolate) |
|
|
|
}, |
|
|
|
}, |
|
|
|
&[5, 10, 20, 40], |
|
|
|
&TEST_DEGREES, |
|
|
|
); |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
criterion_group!{ |
|
|
|
criterion_group!{ |
|
|
|
name = poly_benches; |
|
|
|
name = poly_benches; |
|
|
|
config = Criterion::default(); |
|
|
|
config = Criterion::default(); |
|
|
|
targets = multiplication, interpolate, |
|
|
|
targets = multiplication, interpolate, addition, subtraction, |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|