Skip to content

Commit f3e451e

Browse files
committed
chore(runner-shared): add memtrack serialization benchmark
1 parent 9917a3c commit f3e451e

3 files changed

Lines changed: 154 additions & 2 deletions

File tree

Cargo.lock

Lines changed: 80 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/runner-shared/Cargo.toml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,11 @@ rmp = "0.8.14"
1414
rmp-serde = "1.3.0"
1515
libc = { workspace = true }
1616
zstd = "0.13"
17+
18+
[dev-dependencies]
19+
divan = { version = "4.2.0", package = "codspeed-divan-compat" }
20+
rand = "0.8"
21+
22+
[[bench]]
23+
name = "memtrack_writer"
24+
harness = false
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
use divan::Bencher;
2+
use rand::rngs::StdRng;
3+
use rand::{Rng, SeedableRng};
4+
use runner_shared::artifacts::{MemtrackEvent, MemtrackEventKind, MemtrackWriter};
5+
6+
fn main() {
7+
divan::main();
8+
}
9+
10+
/// Generate N random memtrack events with a seeded RNG
11+
fn generate_events(n: usize) -> Vec<MemtrackEvent> {
12+
let mut rng = StdRng::seed_from_u64(12345);
13+
let mut events = Vec::with_capacity(n);
14+
15+
for _ in 0..n {
16+
let kind = match rng.gen_range(0..8) {
17+
0 => MemtrackEventKind::Malloc {
18+
size: rng.gen_range(8..8192),
19+
},
20+
1 => MemtrackEventKind::Free,
21+
2 => MemtrackEventKind::Realloc {
22+
size: rng.gen_range(8..8192),
23+
},
24+
3 => MemtrackEventKind::Calloc {
25+
size: rng.gen_range(8..8192),
26+
},
27+
4 => MemtrackEventKind::AlignedAlloc {
28+
size: rng.gen_range(8..8192),
29+
},
30+
5 => MemtrackEventKind::Mmap {
31+
size: rng.gen_range(8..8192),
32+
},
33+
6 => MemtrackEventKind::Munmap {
34+
size: rng.gen_range(8..8192),
35+
},
36+
7 => MemtrackEventKind::Brk {
37+
size: rng.gen_range(8..8192),
38+
},
39+
_ => unreachable!(),
40+
};
41+
42+
events.push(MemtrackEvent {
43+
pid: rng.r#gen(),
44+
tid: rng.r#gen(),
45+
timestamp: rng.r#gen(),
46+
addr: rng.r#gen(),
47+
kind,
48+
});
49+
}
50+
51+
events
52+
}
53+
54+
#[divan::bench(args = [10_000, 100_000, 500_000, 1_000_000])]
55+
fn write_events(bencher: Bencher, n: usize) {
56+
let events = generate_events(n);
57+
58+
bencher.bench_local(|| {
59+
let mut output = Vec::new();
60+
let mut writer = MemtrackWriter::new(&mut output).unwrap();
61+
for event in &events {
62+
writer.write_event(event).unwrap();
63+
}
64+
writer.finish().unwrap();
65+
});
66+
}

0 commit comments

Comments
 (0)