Improve benchmarks and add serialization benchmarks.
This commit is contained in:
parent
207cf4eba2
commit
c9e1b24d63
325
benches/api.rs
325
benches/api.rs
|
@ -8,272 +8,153 @@ use bn::*;
|
||||||
use bincode::SizeLimit::Infinite;
|
use bincode::SizeLimit::Infinite;
|
||||||
use bincode::rustc_serialize::{encode, decode};
|
use bincode::rustc_serialize::{encode, decode};
|
||||||
|
|
||||||
#[bench]
|
const SAMPLES: usize = 30;
|
||||||
fn g1_deserialization(b: &mut test::Bencher) {
|
|
||||||
const SAMPLES: usize = 1000;
|
|
||||||
|
|
||||||
let rng = &mut rand::thread_rng();
|
macro_rules! benchmark(
|
||||||
|
($name:ident, $input:ident($rng:ident) = $pre:expr; $post:expr) => (
|
||||||
|
#[bench]
|
||||||
|
fn $name(b: &mut test::Bencher) {
|
||||||
|
let $rng = &mut rand::thread_rng();
|
||||||
|
let $input: Vec<_> = (0..SAMPLES).map(|_| $pre).collect();
|
||||||
|
|
||||||
let serialized: Vec<_> = (0..SAMPLES).map(|_| encode(&G1::random(rng), Infinite).unwrap()).collect();
|
b.bench_n(SAMPLES as u64, |b| {
|
||||||
|
let mut c = 0;
|
||||||
let mut ctr = 0;
|
|
||||||
|
|
||||||
b.iter(|| {
|
b.iter(|| {
|
||||||
ctr += 1;
|
c += 1;
|
||||||
|
|
||||||
decode::<G1>(&serialized[ctr % SAMPLES]).unwrap()
|
let $input = &$input[c % SAMPLES];
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
#[bench]
|
$post
|
||||||
fn g2_deserialization(b: &mut test::Bencher) {
|
})
|
||||||
const SAMPLES: usize = 1000;
|
})
|
||||||
|
}
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
let rng = &mut rand::thread_rng();
|
benchmark!(g1_serialization,
|
||||||
|
input(rng) = G1::random(rng);
|
||||||
|
|
||||||
let serialized: Vec<_> = (0..SAMPLES).map(|_| encode(&G2::random(rng), Infinite).unwrap()).collect();
|
encode(input, Infinite).unwrap()
|
||||||
|
);
|
||||||
|
|
||||||
let mut ctr = 0;
|
benchmark!(g1_serialization_normalized,
|
||||||
|
input(rng) = {let mut tmp = G1::random(rng); tmp.normalize(); tmp};
|
||||||
|
|
||||||
b.iter(|| {
|
encode(input, Infinite).unwrap()
|
||||||
ctr += 1;
|
);
|
||||||
|
|
||||||
decode::<G2>(&serialized[ctr % SAMPLES]).unwrap()
|
benchmark!(g2_serialization,
|
||||||
});
|
input(rng) = G2::random(rng);
|
||||||
}
|
|
||||||
|
|
||||||
#[bench]
|
encode(input, Infinite).unwrap()
|
||||||
fn fr_addition(b: &mut test::Bencher) {
|
);
|
||||||
const SAMPLES: usize = 1000;
|
|
||||||
|
|
||||||
let rng = &mut rand::thread_rng();
|
benchmark!(g2_serialization_normalized,
|
||||||
|
input(rng) = {let mut tmp = G2::random(rng); tmp.normalize(); tmp};
|
||||||
|
|
||||||
let v1: Vec<_> = (0..SAMPLES).map(|_| Fr::random(rng)).collect();
|
encode(input, Infinite).unwrap()
|
||||||
let v2: Vec<_> = (0..SAMPLES).map(|_| Fr::random(rng)).collect();
|
);
|
||||||
|
|
||||||
let mut ctr = 0;
|
benchmark!(g1_deserialization,
|
||||||
|
input(rng) = {encode(&G1::random(rng), Infinite).unwrap()};
|
||||||
|
|
||||||
b.iter(|| {
|
decode::<G1>(input).unwrap()
|
||||||
ctr += 1;
|
);
|
||||||
|
|
||||||
v1[ctr % SAMPLES] + v2[ctr % SAMPLES]
|
benchmark!(g2_deserialization,
|
||||||
});
|
input(rng) = {encode(&G2::random(rng), Infinite).unwrap()};
|
||||||
}
|
|
||||||
|
|
||||||
#[bench]
|
decode::<G2>(input).unwrap()
|
||||||
fn fr_subtraction(b: &mut test::Bencher) {
|
);
|
||||||
const SAMPLES: usize = 1000;
|
|
||||||
|
|
||||||
let rng = &mut rand::thread_rng();
|
benchmark!(fr_addition,
|
||||||
|
input(rng) = (Fr::random(rng), Fr::random(rng));
|
||||||
|
|
||||||
let v1: Vec<_> = (0..SAMPLES).map(|_| Fr::random(rng)).collect();
|
input.0 + input.1
|
||||||
let v2: Vec<_> = (0..SAMPLES).map(|_| Fr::random(rng)).collect();
|
);
|
||||||
|
|
||||||
let mut ctr = 0;
|
benchmark!(fr_subtraction,
|
||||||
|
input(rng) = (Fr::random(rng), Fr::random(rng));
|
||||||
|
|
||||||
b.iter(|| {
|
input.0 - input.1
|
||||||
ctr += 1;
|
);
|
||||||
|
|
||||||
v1[ctr % SAMPLES] - v2[ctr % SAMPLES]
|
benchmark!(fr_multiplication,
|
||||||
});
|
input(rng) = (Fr::random(rng), Fr::random(rng));
|
||||||
}
|
|
||||||
|
|
||||||
#[bench]
|
input.0 * input.1
|
||||||
fn fr_multiplication(b: &mut test::Bencher) {
|
);
|
||||||
const SAMPLES: usize = 1000;
|
|
||||||
|
|
||||||
let rng = &mut rand::thread_rng();
|
benchmark!(fr_inverses,
|
||||||
|
input(rng) = Fr::random(rng);
|
||||||
|
|
||||||
let v1: Vec<_> = (0..SAMPLES).map(|_| Fr::random(rng)).collect();
|
input.inverse()
|
||||||
let v2: Vec<_> = (0..SAMPLES).map(|_| Fr::random(rng)).collect();
|
);
|
||||||
|
|
||||||
let mut ctr = 0;
|
benchmark!(g1_addition,
|
||||||
|
input(rng) = (G1::random(rng), G1::random(rng));
|
||||||
|
|
||||||
b.iter(|| {
|
input.0 + input.1
|
||||||
ctr += 1;
|
);
|
||||||
|
|
||||||
v1[ctr % SAMPLES] * v2[ctr % SAMPLES]
|
benchmark!(g1_subtraction,
|
||||||
});
|
input(rng) = (G1::random(rng), G1::random(rng));
|
||||||
}
|
|
||||||
|
|
||||||
#[bench]
|
input.0 - input.1
|
||||||
fn fr_inverses(b: &mut test::Bencher) {
|
);
|
||||||
const SAMPLES: usize = 1000;
|
|
||||||
|
|
||||||
let rng = &mut rand::thread_rng();
|
benchmark!(g1_scalar_multiplication,
|
||||||
|
input(rng) = (G1::random(rng), Fr::random(rng));
|
||||||
|
|
||||||
let v1: Vec<_> = (0..SAMPLES).map(|_| Fr::random(rng)).collect();
|
input.0 * input.1
|
||||||
|
);
|
||||||
|
|
||||||
let mut ctr = 0;
|
benchmark!(g2_addition,
|
||||||
|
input(rng) = (G2::random(rng), G2::random(rng));
|
||||||
|
|
||||||
b.iter(|| {
|
input.0 + input.1
|
||||||
ctr += 1;
|
);
|
||||||
|
|
||||||
v1[ctr % SAMPLES].inverse()
|
benchmark!(g2_subtraction,
|
||||||
});
|
input(rng) = (G2::random(rng), G2::random(rng));
|
||||||
}
|
|
||||||
|
|
||||||
#[bench]
|
input.0 - input.1
|
||||||
fn g1_addition(b: &mut test::Bencher) {
|
);
|
||||||
const SAMPLES: usize = 100;
|
|
||||||
|
|
||||||
let rng = &mut rand::thread_rng();
|
benchmark!(g2_scalar_multiplication,
|
||||||
|
input(rng) = (G2::random(rng), Fr::random(rng));
|
||||||
|
|
||||||
let v1: Vec<_> = (0..SAMPLES).map(|_| G1::random(rng)).collect();
|
input.0 * input.1
|
||||||
let v2: Vec<_> = (0..SAMPLES).map(|_| G1::random(rng)).collect();
|
);
|
||||||
|
|
||||||
let mut ctr = 0;
|
benchmark!(fq12_scalar_multiplication,
|
||||||
|
input(rng) = {
|
||||||
|
let g1_1 = G1::random(rng);
|
||||||
|
let g2_1 = G2::random(rng);
|
||||||
|
|
||||||
b.iter(|| {
|
let g1_2 = G1::random(rng);
|
||||||
ctr += 1;
|
let g2_2 = G2::random(rng);
|
||||||
|
|
||||||
v1[ctr % SAMPLES] + v2[ctr % SAMPLES]
|
(pairing(g1_1, g2_1), pairing(g1_2, g2_2))
|
||||||
});
|
};
|
||||||
}
|
|
||||||
|
|
||||||
#[bench]
|
input.0 * input.1
|
||||||
fn g1_subtraction(b: &mut test::Bencher) {
|
);
|
||||||
const SAMPLES: usize = 100;
|
|
||||||
|
|
||||||
let rng = &mut rand::thread_rng();
|
benchmark!(fq12_exponentiation,
|
||||||
|
input(rng) = ({
|
||||||
|
let g1 = G1::random(rng);
|
||||||
|
let g2 = G2::random(rng);
|
||||||
|
|
||||||
let v1: Vec<_> = (0..SAMPLES).map(|_| G1::random(rng)).collect();
|
pairing(g1, g2)
|
||||||
let v2: Vec<_> = (0..SAMPLES).map(|_| G1::random(rng)).collect();
|
}, Fr::random(rng));
|
||||||
|
|
||||||
let mut ctr = 0;
|
input.0.pow(input.1)
|
||||||
|
);
|
||||||
|
|
||||||
b.iter(|| {
|
benchmark!(perform_pairing,
|
||||||
ctr += 1;
|
input(rng) = (G1::random(rng), G2::random(rng));
|
||||||
|
|
||||||
v1[ctr % SAMPLES] - v2[ctr % SAMPLES]
|
pairing(input.0, input.1)
|
||||||
});
|
);
|
||||||
}
|
|
||||||
|
|
||||||
#[bench]
|
|
||||||
fn g1_scalar_multiplication(b: &mut test::Bencher) {
|
|
||||||
const SAMPLES: usize = 100;
|
|
||||||
|
|
||||||
let rng = &mut rand::thread_rng();
|
|
||||||
|
|
||||||
let v1: Vec<_> = (0..SAMPLES).map(|_| G1::random(rng)).collect();
|
|
||||||
let v2: Vec<_> = (0..SAMPLES).map(|_| Fr::random(rng)).collect();
|
|
||||||
|
|
||||||
let mut ctr = 0;
|
|
||||||
|
|
||||||
b.iter(|| {
|
|
||||||
ctr += 1;
|
|
||||||
|
|
||||||
v1[ctr % SAMPLES] * v2[ctr % SAMPLES]
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
#[bench]
|
|
||||||
fn g2_addition(b: &mut test::Bencher) {
|
|
||||||
const SAMPLES: usize = 100;
|
|
||||||
|
|
||||||
let rng = &mut rand::thread_rng();
|
|
||||||
|
|
||||||
let v1: Vec<_> = (0..SAMPLES).map(|_| G2::random(rng)).collect();
|
|
||||||
let v2: Vec<_> = (0..SAMPLES).map(|_| G2::random(rng)).collect();
|
|
||||||
|
|
||||||
let mut ctr = 0;
|
|
||||||
|
|
||||||
b.iter(|| {
|
|
||||||
ctr += 1;
|
|
||||||
|
|
||||||
v1[ctr % SAMPLES] + v2[ctr % SAMPLES]
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
#[bench]
|
|
||||||
fn g2_subtraction(b: &mut test::Bencher) {
|
|
||||||
const SAMPLES: usize = 100;
|
|
||||||
|
|
||||||
let rng = &mut rand::thread_rng();
|
|
||||||
|
|
||||||
let v1: Vec<_> = (0..SAMPLES).map(|_| G2::random(rng)).collect();
|
|
||||||
let v2: Vec<_> = (0..SAMPLES).map(|_| G2::random(rng)).collect();
|
|
||||||
|
|
||||||
let mut ctr = 0;
|
|
||||||
|
|
||||||
b.iter(|| {
|
|
||||||
ctr += 1;
|
|
||||||
|
|
||||||
v1[ctr % SAMPLES] - v2[ctr % SAMPLES]
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
#[bench]
|
|
||||||
fn g2_scalar_multiplication(b: &mut test::Bencher) {
|
|
||||||
const SAMPLES: usize = 100;
|
|
||||||
|
|
||||||
let rng = &mut rand::thread_rng();
|
|
||||||
|
|
||||||
let v1: Vec<_> = (0..SAMPLES).map(|_| G2::random(rng)).collect();
|
|
||||||
let v2: Vec<_> = (0..SAMPLES).map(|_| Fr::random(rng)).collect();
|
|
||||||
|
|
||||||
let mut ctr = 0;
|
|
||||||
|
|
||||||
b.iter(|| {
|
|
||||||
ctr += 1;
|
|
||||||
|
|
||||||
v1[ctr % SAMPLES] * v2[ctr % SAMPLES]
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
#[bench]
|
|
||||||
fn fq12_scalar_multiplication(b: &mut test::Bencher) {
|
|
||||||
const SAMPLES: usize = 100;
|
|
||||||
|
|
||||||
let rng = &mut rand::thread_rng();
|
|
||||||
|
|
||||||
let v1: Vec<_> = (0..SAMPLES).map(|_| G1::random(rng)).collect();
|
|
||||||
let v2: Vec<_> = (0..SAMPLES).map(|_| G2::random(rng)).collect();
|
|
||||||
let v3: Vec<_> = (0..SAMPLES).map(|i| pairing(v1[i], v2[i])).collect();
|
|
||||||
|
|
||||||
let mut ctr = 0;
|
|
||||||
|
|
||||||
b.iter(|| {
|
|
||||||
ctr += 1;
|
|
||||||
|
|
||||||
v3[(ctr + SAMPLES/50) % SAMPLES] * v3[ctr % SAMPLES]
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
#[bench]
|
|
||||||
fn fq12_exponentiation(b: &mut test::Bencher) {
|
|
||||||
const SAMPLES: usize = 100;
|
|
||||||
|
|
||||||
let rng = &mut rand::thread_rng();
|
|
||||||
|
|
||||||
let v1: Vec<_> = (0..SAMPLES).map(|_| G1::random(rng)).collect();
|
|
||||||
let v2: Vec<_> = (0..SAMPLES).map(|_| G2::random(rng)).collect();
|
|
||||||
let v3: Vec<_> = (0..SAMPLES).map(|i| pairing(v1[i], v2[i])).collect();
|
|
||||||
let v4: Vec<_> = (0..SAMPLES).map(|_| Fr::random(rng)).collect();
|
|
||||||
|
|
||||||
let mut ctr = 0;
|
|
||||||
|
|
||||||
b.iter(|| {
|
|
||||||
ctr += 1;
|
|
||||||
|
|
||||||
v3[ctr % SAMPLES].pow(v4[ctr % SAMPLES])
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
#[bench]
|
|
||||||
fn perform_pairing(b: &mut test::Bencher) {
|
|
||||||
const SAMPLES: usize = 100;
|
|
||||||
|
|
||||||
let rng = &mut rand::thread_rng();
|
|
||||||
|
|
||||||
let v1: Vec<_> = (0..SAMPLES).map(|_| G1::random(rng)).collect();
|
|
||||||
let v2: Vec<_> = (0..SAMPLES).map(|_| G2::random(rng)).collect();
|
|
||||||
|
|
||||||
let mut ctr = 0;
|
|
||||||
|
|
||||||
b.iter(|| {
|
|
||||||
ctr += 1;
|
|
||||||
|
|
||||||
pairing(v1[ctr % SAMPLES], v2[ctr % SAMPLES])
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue