2020-01-28 23:10:07 -08:00
|
|
|
use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion, Throughput};
|
2020-01-28 21:36:48 -08:00
|
|
|
|
2022-05-05 06:40:29 -07:00
|
|
|
use core::convert::TryFrom;
|
2020-06-15 21:09:01 -07:00
|
|
|
use ed25519_zebra::*;
|
2020-01-28 21:36:48 -08:00
|
|
|
use rand::thread_rng;
|
|
|
|
|
2020-06-15 21:09:01 -07:00
|
|
|
fn sigs_with_distinct_pubkeys() -> impl Iterator<Item = (VerificationKeyBytes, Signature)> {
|
2020-01-28 21:36:48 -08:00
|
|
|
std::iter::repeat_with(|| {
|
2020-06-15 21:09:01 -07:00
|
|
|
let sk = SigningKey::new(thread_rng());
|
|
|
|
let pk_bytes = VerificationKeyBytes::from(&sk);
|
2020-01-28 21:36:48 -08:00
|
|
|
let sig = sk.sign(b"");
|
|
|
|
(pk_bytes, sig)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2020-06-15 21:09:01 -07:00
|
|
|
fn sigs_with_same_pubkey() -> impl Iterator<Item = (VerificationKeyBytes, Signature)> {
|
|
|
|
let sk = SigningKey::new(thread_rng());
|
|
|
|
let pk_bytes = VerificationKeyBytes::from(&sk);
|
2020-01-28 21:36:48 -08:00
|
|
|
std::iter::repeat_with(move || {
|
|
|
|
let sig = sk.sign(b"");
|
|
|
|
(pk_bytes, sig)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
fn bench_batch_verify(c: &mut Criterion) {
|
|
|
|
let mut group = c.benchmark_group("Batch Verification");
|
|
|
|
for n in [8usize, 16, 24, 32, 40, 48, 56, 64].iter() {
|
|
|
|
group.throughput(Throughput::Elements(*n as u64));
|
|
|
|
let sigs = sigs_with_distinct_pubkeys().take(*n).collect::<Vec<_>>();
|
2020-01-29 16:06:30 -08:00
|
|
|
group.bench_with_input(
|
|
|
|
BenchmarkId::new("Unbatched verification", n),
|
|
|
|
&sigs,
|
2020-06-15 21:09:01 -07:00
|
|
|
|b, sigs| {
|
|
|
|
b.iter(|| {
|
|
|
|
for (vk_bytes, sig) in sigs.iter() {
|
|
|
|
let _ =
|
|
|
|
VerificationKey::try_from(*vk_bytes).and_then(|vk| vk.verify(sig, b""));
|
|
|
|
}
|
|
|
|
})
|
|
|
|
},
|
2020-01-29 16:06:30 -08:00
|
|
|
);
|
|
|
|
group.bench_with_input(
|
|
|
|
BenchmarkId::new("Signatures with Distinct Pubkeys", n),
|
|
|
|
&sigs,
|
2020-06-15 21:09:01 -07:00
|
|
|
|b, sigs| {
|
|
|
|
b.iter(|| {
|
2020-06-16 13:44:34 -07:00
|
|
|
let mut batch = batch::Verifier::new();
|
2020-06-15 21:09:01 -07:00
|
|
|
for (vk_bytes, sig) in sigs.iter().cloned() {
|
2020-06-16 13:44:34 -07:00
|
|
|
batch.queue((vk_bytes, sig, b""));
|
2020-06-15 21:09:01 -07:00
|
|
|
}
|
|
|
|
batch.verify(thread_rng())
|
|
|
|
})
|
|
|
|
},
|
2020-01-29 16:06:30 -08:00
|
|
|
);
|
2020-01-28 21:36:48 -08:00
|
|
|
let sigs = sigs_with_same_pubkey().take(*n).collect::<Vec<_>>();
|
2020-01-29 16:06:30 -08:00
|
|
|
group.bench_with_input(
|
|
|
|
BenchmarkId::new("Signatures with the Same Pubkey", n),
|
|
|
|
&sigs,
|
2020-06-15 21:09:01 -07:00
|
|
|
|b, sigs| {
|
|
|
|
b.iter(|| {
|
2020-06-16 13:44:34 -07:00
|
|
|
let mut batch = batch::Verifier::new();
|
2020-06-15 21:09:01 -07:00
|
|
|
for (vk_bytes, sig) in sigs.iter().cloned() {
|
2020-06-16 13:44:34 -07:00
|
|
|
batch.queue((vk_bytes, sig, b""));
|
2020-06-15 21:09:01 -07:00
|
|
|
}
|
|
|
|
batch.verify(thread_rng())
|
|
|
|
})
|
|
|
|
},
|
2020-01-29 16:06:30 -08:00
|
|
|
);
|
2020-01-28 21:36:48 -08:00
|
|
|
}
|
|
|
|
group.finish();
|
|
|
|
}
|
|
|
|
|
|
|
|
criterion_group!(benches, bench_batch_verify);
|
|
|
|
criterion_main!(benches);
|