Skip to content

Commit 2cb7cc4

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

4 files changed

Lines changed: 169 additions & 2 deletions

File tree

.github/workflows/ci.yml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,18 @@ jobs:
4747
- name: Run tests
4848
run: sudo -E $(which cargo) test
4949
working-directory: crates/memtrack
50+
51+
benchmarks:
52+
runs-on: ubuntu-latest
53+
steps:
54+
- uses: actions/checkout@v3
55+
- uses: moonrepo/setup-rust@v1
56+
with:
57+
bins: cargo-codspeed
58+
- name: Build benchmarks
59+
run: cargo codspeed build -p runner-shared
60+
- name: Run benchmarks
61+
uses: CodSpeedHQ/action@v4
62+
with:
63+
mode: instrumentation
64+
run: cargo codspeed run -p runner-shared

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)