atagen

matrix-rust-sdk

public
Star0
Watch0
ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk.git

Blame: benchmarks/benches/crypto_bench.rs

7ff8adafe9e4atagen2026-10-22 12:30 UTC1
use std::{ops::Deref, sync::Arc};
7ff8adafe9e4atagen2026-10-22 12:30 UTC2
7ff8adafe9e4atagen2026-10-22 12:30 UTC3
use criterion::{BenchmarkId, Criterion, Throughput, criterion_group, criterion_main};
7ff8adafe9e4atagen2026-10-22 12:30 UTC4
use matrix_sdk_crypto::{EncryptionSettings, OlmMachine};
7ff8adafe9e4atagen2026-10-22 12:30 UTC5
use matrix_sdk_sqlite::SqliteCryptoStore;
7ff8adafe9e4atagen2026-10-22 12:30 UTC6
use matrix_sdk_test::ruma_response_from_json;
7ff8adafe9e4atagen2026-10-22 12:30 UTC7
use ruma::{
7ff8adafe9e4atagen2026-10-22 12:30 UTC8
    DeviceId, OwnedUserId, TransactionId, UserId,
7ff8adafe9e4atagen2026-10-22 12:30 UTC9
    api::client::{
7ff8adafe9e4atagen2026-10-22 12:30 UTC10
        keys::{claim_keys, get_keys},
7ff8adafe9e4atagen2026-10-22 12:30 UTC11
        to_device::send_event_to_device::v3::Response as ToDeviceResponse,
7ff8adafe9e4atagen2026-10-22 12:30 UTC12
    },
7ff8adafe9e4atagen2026-10-22 12:30 UTC13
    device_id, room_id, user_id,
7ff8adafe9e4atagen2026-10-22 12:30 UTC14
};
7ff8adafe9e4atagen2026-10-22 12:30 UTC15
use serde_json::Value;
7ff8adafe9e4atagen2026-10-22 12:30 UTC16
use tokio::runtime::Builder;
7ff8adafe9e4atagen2026-10-22 12:30 UTC17
7ff8adafe9e4atagen2026-10-22 12:30 UTC18
fn alice_id() -> &'static UserId {
7ff8adafe9e4atagen2026-10-22 12:30 UTC19
    user_id!("@alice:example.org")
7ff8adafe9e4atagen2026-10-22 12:30 UTC20
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC21
7ff8adafe9e4atagen2026-10-22 12:30 UTC22
fn alice_device_id() -> &'static DeviceId {
7ff8adafe9e4atagen2026-10-22 12:30 UTC23
    device_id!("JLAFKJWSCS")
7ff8adafe9e4atagen2026-10-22 12:30 UTC24
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC25
7ff8adafe9e4atagen2026-10-22 12:30 UTC26
fn keys_query_response() -> get_keys::v3::Response {
7ff8adafe9e4atagen2026-10-22 12:30 UTC27
    let data = include_bytes!("crypto_bench/keys_query.json");
7ff8adafe9e4atagen2026-10-22 12:30 UTC28
    let data: Value = serde_json::from_slice(data).unwrap();
7ff8adafe9e4atagen2026-10-22 12:30 UTC29
    ruma_response_from_json(&data)
7ff8adafe9e4atagen2026-10-22 12:30 UTC30
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC31
7ff8adafe9e4atagen2026-10-22 12:30 UTC32
fn keys_claim_response() -> claim_keys::v3::Response {
7ff8adafe9e4atagen2026-10-22 12:30 UTC33
    let data = include_bytes!("crypto_bench/keys_claim.json");
7ff8adafe9e4atagen2026-10-22 12:30 UTC34
    let data: Value = serde_json::from_slice(data).unwrap();
7ff8adafe9e4atagen2026-10-22 12:30 UTC35
    ruma_response_from_json(&data)
7ff8adafe9e4atagen2026-10-22 12:30 UTC36
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC37
7ff8adafe9e4atagen2026-10-22 12:30 UTC38
fn huge_keys_query_response() -> get_keys::v3::Response {
7ff8adafe9e4atagen2026-10-22 12:30 UTC39
    let data = include_bytes!("crypto_bench/keys_query_2000_members.json");
7ff8adafe9e4atagen2026-10-22 12:30 UTC40
    let data: Value = serde_json::from_slice(data).unwrap();
7ff8adafe9e4atagen2026-10-22 12:30 UTC41
    ruma_response_from_json(&data)
7ff8adafe9e4atagen2026-10-22 12:30 UTC42
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC43
7ff8adafe9e4atagen2026-10-22 12:30 UTC44
pub fn keys_query(c: &mut Criterion) {
7ff8adafe9e4atagen2026-10-22 12:30 UTC45
    let runtime = Builder::new_multi_thread().build().expect("Can't create runtime");
7ff8adafe9e4atagen2026-10-22 12:30 UTC46
    let machine = runtime.block_on(OlmMachine::new(alice_id(), alice_device_id()));
7ff8adafe9e4atagen2026-10-22 12:30 UTC47
    let response = keys_query_response();
7ff8adafe9e4atagen2026-10-22 12:30 UTC48
    let txn_id = TransactionId::new();
7ff8adafe9e4atagen2026-10-22 12:30 UTC49
7ff8adafe9e4atagen2026-10-22 12:30 UTC50
    let count = response.device_keys.values().fold(0, |acc, d| acc + d.len())
7ff8adafe9e4atagen2026-10-22 12:30 UTC51
        + response.master_keys.len()
7ff8adafe9e4atagen2026-10-22 12:30 UTC52
        + response.self_signing_keys.len()
7ff8adafe9e4atagen2026-10-22 12:30 UTC53
        + response.user_signing_keys.len();
7ff8adafe9e4atagen2026-10-22 12:30 UTC54
7ff8adafe9e4atagen2026-10-22 12:30 UTC55
    let mut group = c.benchmark_group("Keys querying");
7ff8adafe9e4atagen2026-10-22 12:30 UTC56
    group.throughput(Throughput::Elements(count as u64));
7ff8adafe9e4atagen2026-10-22 12:30 UTC57
7ff8adafe9e4atagen2026-10-22 12:30 UTC58
    let name = format!("{count} device and cross signing keys");
7ff8adafe9e4atagen2026-10-22 12:30 UTC59
7ff8adafe9e4atagen2026-10-22 12:30 UTC60
    // Benchmark memory store.
7ff8adafe9e4atagen2026-10-22 12:30 UTC61
7ff8adafe9e4atagen2026-10-22 12:30 UTC62
    group.bench_with_input(
7ff8adafe9e4atagen2026-10-22 12:30 UTC63
        BenchmarkId::new("Device keys query [memory]", &name),
7ff8adafe9e4atagen2026-10-22 12:30 UTC64
        &response,
7ff8adafe9e4atagen2026-10-22 12:30 UTC65
        |b, response| {
7ff8adafe9e4atagen2026-10-22 12:30 UTC66
            b.to_async(&runtime)
7ff8adafe9e4atagen2026-10-22 12:30 UTC67
                .iter(|| async { machine.mark_request_as_sent(&txn_id, response).await.unwrap() })
7ff8adafe9e4atagen2026-10-22 12:30 UTC68
        },
7ff8adafe9e4atagen2026-10-22 12:30 UTC69
    );
7ff8adafe9e4atagen2026-10-22 12:30 UTC70
7ff8adafe9e4atagen2026-10-22 12:30 UTC71
    // Benchmark sqlite store.
7ff8adafe9e4atagen2026-10-22 12:30 UTC72
7ff8adafe9e4atagen2026-10-22 12:30 UTC73
    let dir = tempfile::tempdir().unwrap();
7ff8adafe9e4atagen2026-10-22 12:30 UTC74
    let store = Arc::new(runtime.block_on(SqliteCryptoStore::open(dir.path(), None)).unwrap());
7ff8adafe9e4atagen2026-10-22 12:30 UTC75
    let machine = runtime
7ff8adafe9e4atagen2026-10-22 12:30 UTC76
        .block_on(OlmMachine::with_store(alice_id(), alice_device_id(), store, None))
7ff8adafe9e4atagen2026-10-22 12:30 UTC77
        .unwrap();
7ff8adafe9e4atagen2026-10-22 12:30 UTC78
7ff8adafe9e4atagen2026-10-22 12:30 UTC79
    group.bench_with_input(
7ff8adafe9e4atagen2026-10-22 12:30 UTC80
        BenchmarkId::new("Device keys query [SQLite]", &name),
7ff8adafe9e4atagen2026-10-22 12:30 UTC81
        &response,
7ff8adafe9e4atagen2026-10-22 12:30 UTC82
        |b, response| {
7ff8adafe9e4atagen2026-10-22 12:30 UTC83
            b.to_async(&runtime)
7ff8adafe9e4atagen2026-10-22 12:30 UTC84
                .iter(|| async { machine.mark_request_as_sent(&txn_id, response).await.unwrap() })
7ff8adafe9e4atagen2026-10-22 12:30 UTC85
        },
7ff8adafe9e4atagen2026-10-22 12:30 UTC86
    );
7ff8adafe9e4atagen2026-10-22 12:30 UTC87
7ff8adafe9e4atagen2026-10-22 12:30 UTC88
    {
7ff8adafe9e4atagen2026-10-22 12:30 UTC89
        let _guard = runtime.enter();
7ff8adafe9e4atagen2026-10-22 12:30 UTC90
        drop(machine);
7ff8adafe9e4atagen2026-10-22 12:30 UTC91
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC92
7ff8adafe9e4atagen2026-10-22 12:30 UTC93
    group.finish()
7ff8adafe9e4atagen2026-10-22 12:30 UTC94
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC95
7ff8adafe9e4atagen2026-10-22 12:30 UTC96
/// This test panics on the CI, not sure why so we're disabling it for now.
7ff8adafe9e4atagen2026-10-22 12:30 UTC97
#[cfg(not(feature = "codspeed"))]
7ff8adafe9e4atagen2026-10-22 12:30 UTC98
pub fn keys_claiming(c: &mut Criterion) {
7ff8adafe9e4atagen2026-10-22 12:30 UTC99
    let runtime = Builder::new_multi_thread().build().expect("Can't create runtime");
7ff8adafe9e4atagen2026-10-22 12:30 UTC100
7ff8adafe9e4atagen2026-10-22 12:30 UTC101
    let keys_query_response = keys_query_response();
7ff8adafe9e4atagen2026-10-22 12:30 UTC102
    let txn_id = TransactionId::new();
7ff8adafe9e4atagen2026-10-22 12:30 UTC103
7ff8adafe9e4atagen2026-10-22 12:30 UTC104
    let response = keys_claim_response();
7ff8adafe9e4atagen2026-10-22 12:30 UTC105
7ff8adafe9e4atagen2026-10-22 12:30 UTC106
    let count = response.one_time_keys.values().fold(0, |acc, d| acc + d.len());
7ff8adafe9e4atagen2026-10-22 12:30 UTC107
7ff8adafe9e4atagen2026-10-22 12:30 UTC108
    let mut group = c.benchmark_group("Olm session creation");
7ff8adafe9e4atagen2026-10-22 12:30 UTC109
    group.throughput(Throughput::Elements(count as u64));
7ff8adafe9e4atagen2026-10-22 12:30 UTC110
7ff8adafe9e4atagen2026-10-22 12:30 UTC111
    let name = format!("{count} one-time keys");
7ff8adafe9e4atagen2026-10-22 12:30 UTC112
7ff8adafe9e4atagen2026-10-22 12:30 UTC113
    group.bench_with_input(
7ff8adafe9e4atagen2026-10-22 12:30 UTC114
        BenchmarkId::new("One-time keys claiming [memory]", &name),
7ff8adafe9e4atagen2026-10-22 12:30 UTC115
        &response,
7ff8adafe9e4atagen2026-10-22 12:30 UTC116
        |b, response| {
7ff8adafe9e4atagen2026-10-22 12:30 UTC117
            b.iter_batched(
7ff8adafe9e4atagen2026-10-22 12:30 UTC118
                || {
7ff8adafe9e4atagen2026-10-22 12:30 UTC119
                    let machine = runtime.block_on(OlmMachine::new(alice_id(), alice_device_id()));
7ff8adafe9e4atagen2026-10-22 12:30 UTC120
                    runtime
7ff8adafe9e4atagen2026-10-22 12:30 UTC121
                        .block_on(machine.mark_request_as_sent(&txn_id, &keys_query_response))
7ff8adafe9e4atagen2026-10-22 12:30 UTC122
                        .unwrap();
7ff8adafe9e4atagen2026-10-22 12:30 UTC123
                    (machine, &runtime, &txn_id)
7ff8adafe9e4atagen2026-10-22 12:30 UTC124
                },
7ff8adafe9e4atagen2026-10-22 12:30 UTC125
                move |(machine, runtime, txn_id)| {
7ff8adafe9e4atagen2026-10-22 12:30 UTC126
                    runtime.block_on(async {
7ff8adafe9e4atagen2026-10-22 12:30 UTC127
                        machine.mark_request_as_sent(txn_id, response).await.unwrap();
7ff8adafe9e4atagen2026-10-22 12:30 UTC128
                        drop(machine);
7ff8adafe9e4atagen2026-10-22 12:30 UTC129
                    })
7ff8adafe9e4atagen2026-10-22 12:30 UTC130
                },
7ff8adafe9e4atagen2026-10-22 12:30 UTC131
                criterion::BatchSize::SmallInput,
7ff8adafe9e4atagen2026-10-22 12:30 UTC132
            )
7ff8adafe9e4atagen2026-10-22 12:30 UTC133
        },
7ff8adafe9e4atagen2026-10-22 12:30 UTC134
    );
7ff8adafe9e4atagen2026-10-22 12:30 UTC135
7ff8adafe9e4atagen2026-10-22 12:30 UTC136
    group.bench_with_input(
7ff8adafe9e4atagen2026-10-22 12:30 UTC137
        BenchmarkId::new("One-time keys claiming [SQLite]", &name),
7ff8adafe9e4atagen2026-10-22 12:30 UTC138
        &response,
7ff8adafe9e4atagen2026-10-22 12:30 UTC139
        |b, response| {
7ff8adafe9e4atagen2026-10-22 12:30 UTC140
            b.iter_batched(
7ff8adafe9e4atagen2026-10-22 12:30 UTC141
                || {
7ff8adafe9e4atagen2026-10-22 12:30 UTC142
                    let dir = tempfile::tempdir().unwrap();
7ff8adafe9e4atagen2026-10-22 12:30 UTC143
                    let store = Arc::new(
7ff8adafe9e4atagen2026-10-22 12:30 UTC144
                        runtime.block_on(SqliteCryptoStore::open(dir.path(), None)).unwrap(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC145
                    );
7ff8adafe9e4atagen2026-10-22 12:30 UTC146
7ff8adafe9e4atagen2026-10-22 12:30 UTC147
                    let machine = runtime
7ff8adafe9e4atagen2026-10-22 12:30 UTC148
                        .block_on(OlmMachine::with_store(
7ff8adafe9e4atagen2026-10-22 12:30 UTC149
                            alice_id(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC150
                            alice_device_id(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC151
                            store,
7ff8adafe9e4atagen2026-10-22 12:30 UTC152
                            None,
7ff8adafe9e4atagen2026-10-22 12:30 UTC153
                        ))
7ff8adafe9e4atagen2026-10-22 12:30 UTC154
                        .unwrap();
7ff8adafe9e4atagen2026-10-22 12:30 UTC155
                    runtime
7ff8adafe9e4atagen2026-10-22 12:30 UTC156
                        .block_on(machine.mark_request_as_sent(&txn_id, &keys_query_response))
7ff8adafe9e4atagen2026-10-22 12:30 UTC157
                        .unwrap();
7ff8adafe9e4atagen2026-10-22 12:30 UTC158
                    (machine, &runtime, &txn_id)
7ff8adafe9e4atagen2026-10-22 12:30 UTC159
                },
7ff8adafe9e4atagen2026-10-22 12:30 UTC160
                move |(machine, runtime, txn_id)| {
7ff8adafe9e4atagen2026-10-22 12:30 UTC161
                    runtime.block_on(async {
7ff8adafe9e4atagen2026-10-22 12:30 UTC162
                        machine.mark_request_as_sent(txn_id, response).await.unwrap();
7ff8adafe9e4atagen2026-10-22 12:30 UTC163
                    });
7ff8adafe9e4atagen2026-10-22 12:30 UTC164
7ff8adafe9e4atagen2026-10-22 12:30 UTC165
                    let _ = runtime.enter();
7ff8adafe9e4atagen2026-10-22 12:30 UTC166
                    drop(machine);
7ff8adafe9e4atagen2026-10-22 12:30 UTC167
                },
7ff8adafe9e4atagen2026-10-22 12:30 UTC168
                criterion::BatchSize::SmallInput,
7ff8adafe9e4atagen2026-10-22 12:30 UTC169
            )
7ff8adafe9e4atagen2026-10-22 12:30 UTC170
        },
7ff8adafe9e4atagen2026-10-22 12:30 UTC171
    );
7ff8adafe9e4atagen2026-10-22 12:30 UTC172
7ff8adafe9e4atagen2026-10-22 12:30 UTC173
    group.finish()
7ff8adafe9e4atagen2026-10-22 12:30 UTC174
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC175
7ff8adafe9e4atagen2026-10-22 12:30 UTC176
pub fn room_key_sharing(c: &mut Criterion) {
7ff8adafe9e4atagen2026-10-22 12:30 UTC177
    let runtime = Builder::new_multi_thread().build().expect("Can't create runtime");
7ff8adafe9e4atagen2026-10-22 12:30 UTC178
7ff8adafe9e4atagen2026-10-22 12:30 UTC179
    let keys_query_response = keys_query_response();
7ff8adafe9e4atagen2026-10-22 12:30 UTC180
    let txn_id = TransactionId::new();
7ff8adafe9e4atagen2026-10-22 12:30 UTC181
    let response = keys_claim_response();
7ff8adafe9e4atagen2026-10-22 12:30 UTC182
    let room_id = room_id!("!test:localhost");
7ff8adafe9e4atagen2026-10-22 12:30 UTC183
7ff8adafe9e4atagen2026-10-22 12:30 UTC184
    let to_device_response = ToDeviceResponse::new();
7ff8adafe9e4atagen2026-10-22 12:30 UTC185
    let users: Vec<OwnedUserId> = keys_query_response.device_keys.keys().cloned().collect();
7ff8adafe9e4atagen2026-10-22 12:30 UTC186
7ff8adafe9e4atagen2026-10-22 12:30 UTC187
    let count = response.one_time_keys.values().fold(0, |acc, d| acc + d.len());
7ff8adafe9e4atagen2026-10-22 12:30 UTC188
7ff8adafe9e4atagen2026-10-22 12:30 UTC189
    let machine = runtime.block_on(OlmMachine::new(alice_id(), alice_device_id()));
7ff8adafe9e4atagen2026-10-22 12:30 UTC190
    runtime.block_on(machine.mark_request_as_sent(&txn_id, &keys_query_response)).unwrap();
7ff8adafe9e4atagen2026-10-22 12:30 UTC191
    runtime.block_on(machine.mark_request_as_sent(&txn_id, &response)).unwrap();
7ff8adafe9e4atagen2026-10-22 12:30 UTC192
7ff8adafe9e4atagen2026-10-22 12:30 UTC193
    let mut group = c.benchmark_group("Room key sharing");
7ff8adafe9e4atagen2026-10-22 12:30 UTC194
    group.throughput(Throughput::Elements(count as u64));
7ff8adafe9e4atagen2026-10-22 12:30 UTC195
    let name = format!("{count} devices");
7ff8adafe9e4atagen2026-10-22 12:30 UTC196
7ff8adafe9e4atagen2026-10-22 12:30 UTC197
    // Benchmark memory store.
7ff8adafe9e4atagen2026-10-22 12:30 UTC198
7ff8adafe9e4atagen2026-10-22 12:30 UTC199
    group.bench_function(BenchmarkId::new("Room key sharing [memory]", &name), |b| {
7ff8adafe9e4atagen2026-10-22 12:30 UTC200
        b.to_async(&runtime).iter(|| async {
7ff8adafe9e4atagen2026-10-22 12:30 UTC201
            let requests = machine
7ff8adafe9e4atagen2026-10-22 12:30 UTC202
                .share_room_key(
7ff8adafe9e4atagen2026-10-22 12:30 UTC203
                    room_id,
7ff8adafe9e4atagen2026-10-22 12:30 UTC204
                    users.iter().map(Deref::deref),
7ff8adafe9e4atagen2026-10-22 12:30 UTC205
                    EncryptionSettings::default(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC206
                )
7ff8adafe9e4atagen2026-10-22 12:30 UTC207
                .await
7ff8adafe9e4atagen2026-10-22 12:30 UTC208
                .unwrap();
7ff8adafe9e4atagen2026-10-22 12:30 UTC209
7ff8adafe9e4atagen2026-10-22 12:30 UTC210
            assert!(!requests.is_empty());
7ff8adafe9e4atagen2026-10-22 12:30 UTC211
7ff8adafe9e4atagen2026-10-22 12:30 UTC212
            for request in requests {
7ff8adafe9e4atagen2026-10-22 12:30 UTC213
                machine.mark_request_as_sent(&request.txn_id, &to_device_response).await.unwrap();
7ff8adafe9e4atagen2026-10-22 12:30 UTC214
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC215
7ff8adafe9e4atagen2026-10-22 12:30 UTC216
            machine.discard_room_key(room_id).await.unwrap();
7ff8adafe9e4atagen2026-10-22 12:30 UTC217
        })
7ff8adafe9e4atagen2026-10-22 12:30 UTC218
    });
7ff8adafe9e4atagen2026-10-22 12:30 UTC219
7ff8adafe9e4atagen2026-10-22 12:30 UTC220
    // Benchmark sqlite store.
7ff8adafe9e4atagen2026-10-22 12:30 UTC221
7ff8adafe9e4atagen2026-10-22 12:30 UTC222
    let dir = tempfile::tempdir().unwrap();
7ff8adafe9e4atagen2026-10-22 12:30 UTC223
    let store = Arc::new(runtime.block_on(SqliteCryptoStore::open(dir.path(), None)).unwrap());
7ff8adafe9e4atagen2026-10-22 12:30 UTC224
7ff8adafe9e4atagen2026-10-22 12:30 UTC225
    let machine = runtime
7ff8adafe9e4atagen2026-10-22 12:30 UTC226
        .block_on(OlmMachine::with_store(alice_id(), alice_device_id(), store, None))
7ff8adafe9e4atagen2026-10-22 12:30 UTC227
        .unwrap();
7ff8adafe9e4atagen2026-10-22 12:30 UTC228
    runtime.block_on(machine.mark_request_as_sent(&txn_id, &keys_query_response)).unwrap();
7ff8adafe9e4atagen2026-10-22 12:30 UTC229
    runtime.block_on(machine.mark_request_as_sent(&txn_id, &response)).unwrap();
7ff8adafe9e4atagen2026-10-22 12:30 UTC230
7ff8adafe9e4atagen2026-10-22 12:30 UTC231
    group.bench_function(BenchmarkId::new("Room key sharing [SQLite]", &name), |b| {
7ff8adafe9e4atagen2026-10-22 12:30 UTC232
        b.to_async(&runtime).iter(|| async {
7ff8adafe9e4atagen2026-10-22 12:30 UTC233
            let requests = machine
7ff8adafe9e4atagen2026-10-22 12:30 UTC234
                .share_room_key(
7ff8adafe9e4atagen2026-10-22 12:30 UTC235
                    room_id,
7ff8adafe9e4atagen2026-10-22 12:30 UTC236
                    users.iter().map(Deref::deref),
7ff8adafe9e4atagen2026-10-22 12:30 UTC237
                    EncryptionSettings::default(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC238
                )
7ff8adafe9e4atagen2026-10-22 12:30 UTC239
                .await
7ff8adafe9e4atagen2026-10-22 12:30 UTC240
                .unwrap();
7ff8adafe9e4atagen2026-10-22 12:30 UTC241
7ff8adafe9e4atagen2026-10-22 12:30 UTC242
            assert!(!requests.is_empty());
7ff8adafe9e4atagen2026-10-22 12:30 UTC243
7ff8adafe9e4atagen2026-10-22 12:30 UTC244
            for request in requests {
7ff8adafe9e4atagen2026-10-22 12:30 UTC245
                machine.mark_request_as_sent(&request.txn_id, &to_device_response).await.unwrap();
7ff8adafe9e4atagen2026-10-22 12:30 UTC246
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC247
7ff8adafe9e4atagen2026-10-22 12:30 UTC248
            machine.discard_room_key(room_id).await.unwrap();
7ff8adafe9e4atagen2026-10-22 12:30 UTC249
        })
7ff8adafe9e4atagen2026-10-22 12:30 UTC250
    });
7ff8adafe9e4atagen2026-10-22 12:30 UTC251
7ff8adafe9e4atagen2026-10-22 12:30 UTC252
    {
7ff8adafe9e4atagen2026-10-22 12:30 UTC253
        let _guard = runtime.enter();
7ff8adafe9e4atagen2026-10-22 12:30 UTC254
        drop(machine);
7ff8adafe9e4atagen2026-10-22 12:30 UTC255
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC256
7ff8adafe9e4atagen2026-10-22 12:30 UTC257
    group.finish()
7ff8adafe9e4atagen2026-10-22 12:30 UTC258
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC259
7ff8adafe9e4atagen2026-10-22 12:30 UTC260
pub fn devices_missing_sessions_collecting(c: &mut Criterion) {
7ff8adafe9e4atagen2026-10-22 12:30 UTC261
    let runtime = Builder::new_multi_thread().build().expect("Can't create runtime");
7ff8adafe9e4atagen2026-10-22 12:30 UTC262
7ff8adafe9e4atagen2026-10-22 12:30 UTC263
    let machine = runtime.block_on(OlmMachine::new(alice_id(), alice_device_id()));
7ff8adafe9e4atagen2026-10-22 12:30 UTC264
    let response = huge_keys_query_response();
7ff8adafe9e4atagen2026-10-22 12:30 UTC265
    let txn_id = TransactionId::new();
7ff8adafe9e4atagen2026-10-22 12:30 UTC266
    let users: Vec<OwnedUserId> = response.device_keys.keys().cloned().collect();
7ff8adafe9e4atagen2026-10-22 12:30 UTC267
7ff8adafe9e4atagen2026-10-22 12:30 UTC268
    let count = response.device_keys.values().fold(0, |acc, d| acc + d.len());
7ff8adafe9e4atagen2026-10-22 12:30 UTC269
7ff8adafe9e4atagen2026-10-22 12:30 UTC270
    let mut group = c.benchmark_group("Devices missing sessions collecting");
7ff8adafe9e4atagen2026-10-22 12:30 UTC271
    group.throughput(Throughput::Elements(count as u64));
7ff8adafe9e4atagen2026-10-22 12:30 UTC272
7ff8adafe9e4atagen2026-10-22 12:30 UTC273
    let name = format!("{count} devices");
7ff8adafe9e4atagen2026-10-22 12:30 UTC274
7ff8adafe9e4atagen2026-10-22 12:30 UTC275
    runtime.block_on(machine.mark_request_as_sent(&txn_id, &response)).unwrap();
7ff8adafe9e4atagen2026-10-22 12:30 UTC276
7ff8adafe9e4atagen2026-10-22 12:30 UTC277
    // Benchmark memory store.
7ff8adafe9e4atagen2026-10-22 12:30 UTC278
7ff8adafe9e4atagen2026-10-22 12:30 UTC279
    group.bench_function(BenchmarkId::new("Devices collecting [memory]", &name), |b| {
7ff8adafe9e4atagen2026-10-22 12:30 UTC280
        b.to_async(&runtime).iter_with_large_drop(|| async {
7ff8adafe9e4atagen2026-10-22 12:30 UTC281
            machine.get_missing_sessions(users.iter().map(Deref::deref)).await.unwrap()
7ff8adafe9e4atagen2026-10-22 12:30 UTC282
        })
7ff8adafe9e4atagen2026-10-22 12:30 UTC283
    });
7ff8adafe9e4atagen2026-10-22 12:30 UTC284
7ff8adafe9e4atagen2026-10-22 12:30 UTC285
    // Benchmark sqlite store.
7ff8adafe9e4atagen2026-10-22 12:30 UTC286
7ff8adafe9e4atagen2026-10-22 12:30 UTC287
    let dir = tempfile::tempdir().unwrap();
7ff8adafe9e4atagen2026-10-22 12:30 UTC288
    let store = Arc::new(runtime.block_on(SqliteCryptoStore::open(dir.path(), None)).unwrap());
7ff8adafe9e4atagen2026-10-22 12:30 UTC289
7ff8adafe9e4atagen2026-10-22 12:30 UTC290
    let machine = runtime
7ff8adafe9e4atagen2026-10-22 12:30 UTC291
        .block_on(OlmMachine::with_store(alice_id(), alice_device_id(), store, None))
7ff8adafe9e4atagen2026-10-22 12:30 UTC292
        .unwrap();
7ff8adafe9e4atagen2026-10-22 12:30 UTC293
7ff8adafe9e4atagen2026-10-22 12:30 UTC294
    runtime.block_on(machine.mark_request_as_sent(&txn_id, &response)).unwrap();
7ff8adafe9e4atagen2026-10-22 12:30 UTC295
7ff8adafe9e4atagen2026-10-22 12:30 UTC296
    group.bench_function(BenchmarkId::new("Devices collecting [SQLite]", &name), |b| {
7ff8adafe9e4atagen2026-10-22 12:30 UTC297
        b.to_async(&runtime).iter(|| async {
7ff8adafe9e4atagen2026-10-22 12:30 UTC298
            machine.get_missing_sessions(users.iter().map(Deref::deref)).await.unwrap()
7ff8adafe9e4atagen2026-10-22 12:30 UTC299
        })
7ff8adafe9e4atagen2026-10-22 12:30 UTC300
    });
7ff8adafe9e4atagen2026-10-22 12:30 UTC301
7ff8adafe9e4atagen2026-10-22 12:30 UTC302
    {
7ff8adafe9e4atagen2026-10-22 12:30 UTC303
        let _guard = runtime.enter();
7ff8adafe9e4atagen2026-10-22 12:30 UTC304
        drop(machine);
7ff8adafe9e4atagen2026-10-22 12:30 UTC305
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC306
7ff8adafe9e4atagen2026-10-22 12:30 UTC307
    group.finish()
7ff8adafe9e4atagen2026-10-22 12:30 UTC308
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC309
7ff8adafe9e4atagen2026-10-22 12:30 UTC310
#[cfg(not(feature = "codspeed"))]
7ff8adafe9e4atagen2026-10-22 12:30 UTC311
criterion_group! {
7ff8adafe9e4atagen2026-10-22 12:30 UTC312
    name = benches;
7ff8adafe9e4atagen2026-10-22 12:30 UTC313
    config = Criterion::default();
7ff8adafe9e4atagen2026-10-22 12:30 UTC314
    targets = keys_query, keys_claiming, room_key_sharing, devices_missing_sessions_collecting,
7ff8adafe9e4atagen2026-10-22 12:30 UTC315
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC316
7ff8adafe9e4atagen2026-10-22 12:30 UTC317
#[cfg(feature = "codspeed")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC318
criterion_group! {
7ff8adafe9e4atagen2026-10-22 12:30 UTC319
    name = benches;
7ff8adafe9e4atagen2026-10-22 12:30 UTC320
    config = Criterion::default();
7ff8adafe9e4atagen2026-10-22 12:30 UTC321
    targets = keys_query, room_key_sharing, devices_missing_sessions_collecting,
7ff8adafe9e4atagen2026-10-22 12:30 UTC322
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC323
7ff8adafe9e4atagen2026-10-22 12:30 UTC324
criterion_main!(benches);