subms_block_cache/
recipe.rs1use 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}