Skip to main content

subms_block_cache/
recipe.rs

1//! `SubMsRecipe` impl.
2
3use subms::{
4    SubMsBenchParams, SubMsLcg, SubMsPerfHarness, SubMsRecipe, SubMsStageKind, SubMsTimer,
5};
6
7use crate::BlockCache;
8
9pub struct BlockCacheRecipe;
10
11impl SubMsRecipe for BlockCacheRecipe {
12    fn name(&self) -> &str {
13        "block-cache"
14    }
15
16    fn run(&self, h: &mut SubMsPerfHarness, params: &SubMsBenchParams) {
17        let entries = params.entries;
18        let warmup = params.warmup;
19        let seed = params.seed;
20        let cap = 1024;
21        let mut c: BlockCache<u32, u32> = BlockCache::with_capacity(cap);
22
23        let mut rng = SubMsLcg::new(seed);
24        for _ in 0..warmup {
25            let k = rng.bounded((cap * 2) as u32);
26            c.put(k, k);
27        }
28
29        let s_get = h.stage("get", entries).with_kind(SubMsStageKind::HotPath);
30        let mut rng = SubMsLcg::new(seed.wrapping_add(1));
31        for _ in 0..entries {
32            let k = rng.bounded((cap * 2) as u32);
33            let t0 = SubMsTimer::tick();
34            let _ = c.get(&k);
35            s_get.record(t0.elapsed_ns());
36        }
37
38        let s_put = h.stage("put", entries).with_kind(SubMsStageKind::HotPath);
39        let mut rng = SubMsLcg::new(seed.wrapping_add(2));
40        for _ in 0..entries {
41            let k = rng.bounded((cap * 4) as u32);
42            let t0 = SubMsTimer::tick();
43            c.put(k, k);
44            s_put.record(t0.elapsed_ns());
45        }
46
47        h.add_meta("capacity", &cap.to_string());
48    }
49}