Skip to main content

subms_merge_iterator/
recipe.rs

1//! `SubMsRecipe` impl.
2
3use 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        // Build N sorted ascending streams. stream s has values s, s+N, s+2N, ...
19        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}