subms_merge_iterator/
recipe.rs1use subms::{SubMsBenchParams, SubMsPerfHarness, SubMsRecipe, SubMsStageKind, SubMsTimer};
4
5use crate::MergeIterator;
6
7pub struct MergeIteratorRecipe;
8
9impl SubMsRecipe for MergeIteratorRecipe {
10 fn name(&self) -> &str {
11 "merge-iterator"
12 }
13
14 fn run(&self, h: &mut SubMsPerfHarness, params: &SubMsBenchParams) {
15 let n_streams = 16usize;
16 let per_stream = params.entries / n_streams;
17
18 let streams: Vec<std::vec::IntoIter<u64>> = (0..n_streams)
20 .map(|s| {
21 (0..per_stream)
22 .map(move |i| (s + i * n_streams) as u64)
23 .collect::<Vec<_>>()
24 .into_iter()
25 })
26 .collect();
27
28 let mut iter = MergeIterator::new(streams);
29 let total = n_streams * per_stream;
30 let s_next = h.stage("next", total).with_kind(SubMsStageKind::HotPath);
31 for _ in 0..total {
32 let t0 = SubMsTimer::tick();
33 let _ = iter.next();
34 s_next.record(t0.elapsed_ns());
35 }
36
37 h.add_meta("streams", &n_streams.to_string());
38 h.add_meta("per_stream", &per_stream.to_string());
39 }
40}