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:
parent
1ddbb95ad4
commit
9822bb3b64
1
Cargo.lock
generated
1
Cargo.lock
generated
@ -2014,6 +2014,7 @@ checksum = "99c0ec316ab08201476c032feb2f94a5c8ece5b209765c1fbc4430dd6e931ad6"
|
||||
name = "usernames"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"criterion",
|
||||
"curve25519-dalek",
|
||||
"displaydoc",
|
||||
"lazy_static",
|
||||
|
@ -28,3 +28,8 @@ branch = "lizard2"
|
||||
[dev-dependencies]
|
||||
zkgroup = { path = "../zkgroup" }
|
||||
proptest = "1.0"
|
||||
criterion = "0.4"
|
||||
|
||||
[[bench]]
|
||||
name = "usernames_benchmarks"
|
||||
harness = false
|
||||
|
53
rust/usernames/benches/usernames_benchmarks.rs
Normal file
53
rust/usernames/benches/usernames_benchmarks.rs
Normal 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);
|
Loading…
Reference in New Issue
Block a user