0
0
mirror of https://github.com/signalapp/libsignal.git synced 2024-09-19 19:42:19 +02:00

Implement benchmarks for usernames API

This commit is contained in:
Max Moiseev 2023-02-08 11:22:21 -08:00 committed by moiseev-signal
parent 1ddbb95ad4
commit 9822bb3b64
3 changed files with 59 additions and 0 deletions

1
Cargo.lock generated
View File

@ -2014,6 +2014,7 @@ checksum = "99c0ec316ab08201476c032feb2f94a5c8ece5b209765c1fbc4430dd6e931ad6"
name = "usernames"
version = "0.1.0"
dependencies = [
"criterion",
"curve25519-dalek",
"displaydoc",
"lazy_static",

View File

@ -28,3 +28,8 @@ branch = "lizard2"
[dev-dependencies]
zkgroup = { path = "../zkgroup" }
proptest = "1.0"
criterion = "0.4"
[[bench]]
name = "usernames_benchmarks"
harness = false

View File

@ -0,0 +1,53 @@
//
// Copyright 2023 Signal Messenger, LLC.
// SPDX-License-Identifier: AGPL-3.0-only
//
use criterion::{criterion_group, criterion_main, Criterion};
use rand::rngs::OsRng;
extern crate usernames;
use usernames::{NicknameLimits, Username, UsernameError};
pub fn username_hash(username: &str) -> Result<[u8; 32], UsernameError> {
Username::new(username).map(|un| un.hash())
}
pub fn username_proof(username: &str, randomness: &[u8]) -> Result<Vec<u8>, UsernameError> {
Username::new(username)?.proof(randomness)
}
// Username validation is inseparable from the hash/proof calculations and therefore its costs are
// included in the benchmarks for both.
fn bench_usernames(c: &mut Criterion) {
let mut rng = OsRng;
let usernames =
Username::candidates_from(&mut rng, "signal", NicknameLimits::default()).unwrap();
let mut infinite_usernames = usernames.iter().cycle();
c.bench_function("username_hash", |b| {
b.iter(|| username_hash(infinite_usernames.next().unwrap()))
});
let randomness: Vec<u8> = (0..32).collect();
c.bench_function("username_proof", |b| {
b.iter(|| username_proof(infinite_usernames.next().unwrap(), &randomness))
});
let mut infinite_input = usernames
.iter()
.map(|name| {
let username = Username::new(name).unwrap();
let proof = username.proof(&randomness).unwrap();
(username, proof)
})
.cycle();
c.bench_function("username_verify_proof", |b| {
b.iter(|| {
let (username, proof) = infinite_input.next().unwrap();
Username::verify_proof(&proof, username.hash()).unwrap()
})
});
}
criterion_group!(benches, bench_usernames);
criterion_main!(benches);