1 // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2 // Copyright by contributors to this project.
3 // SPDX-License-Identifier: (Apache-2.0 OR MIT)
4
5 use criterion::{BatchSize, BenchmarkId, Criterion};
6 use mls_rs::{
7 client_builder::MlsConfig,
8 identity::{
9 basic::{BasicCredential, BasicIdentityProvider},
10 SigningIdentity,
11 },
12 mls_rules::{CommitOptions, DefaultMlsRules},
13 CipherSuite, CipherSuiteProvider, Client, CryptoProvider,
14 };
15 use mls_rs_crypto_openssl::OpensslCryptoProvider;
16
bench(c: &mut Criterion)17 fn bench(c: &mut Criterion) {
18 let alice = make_client("alice")
19 .create_group(Default::default())
20 .unwrap();
21
22 const MAX_ADD_COUNT: usize = 1000;
23
24 let key_packages = (0..MAX_ADD_COUNT)
25 .map(|i| {
26 make_client(&format!("bob-{i}"))
27 .generate_key_package_message()
28 .unwrap()
29 })
30 .collect::<Vec<_>>();
31
32 let mut group = c.benchmark_group("group_add");
33
34 std::iter::successors(Some(1), |&i| Some(i * 10))
35 .take_while(|&i| i <= MAX_ADD_COUNT)
36 .for_each(|size| {
37 group.bench_with_input(BenchmarkId::from_parameter(size), &size, |b, &size| {
38 b.iter_batched_ref(
39 || alice.clone(),
40 |alice| {
41 key_packages[..size]
42 .iter()
43 .cloned()
44 .fold(alice.commit_builder(), |builder, key_package| {
45 builder.add_member(key_package).unwrap()
46 })
47 .build()
48 .unwrap();
49 },
50 BatchSize::SmallInput,
51 );
52 });
53 });
54
55 group.finish();
56 }
57
58 criterion::criterion_group!(benches, bench);
59 criterion::criterion_main!(benches);
60
make_client(name: &str) -> Client<impl MlsConfig>61 fn make_client(name: &str) -> Client<impl MlsConfig> {
62 let crypto_provider = OpensslCryptoProvider::new();
63 let cipher_suite = CipherSuite::CURVE25519_AES128;
64
65 let (secret_key, public_key) = crypto_provider
66 .cipher_suite_provider(cipher_suite)
67 .unwrap()
68 .signature_key_generate()
69 .unwrap();
70
71 Client::builder()
72 .crypto_provider(crypto_provider)
73 .identity_provider(BasicIdentityProvider)
74 .mls_rules(
75 DefaultMlsRules::new()
76 .with_commit_options(CommitOptions::new().with_ratchet_tree_extension(false)),
77 )
78 .signing_identity(
79 SigningIdentity::new(
80 BasicCredential::new(name.as_bytes().to_vec()).into_credential(),
81 public_key,
82 ),
83 secret_key,
84 cipher_suite,
85 )
86 .build()
87 }
88