Skip to content

Commit 35e5f3f

Browse files
committed
chore(runner-shared): add memtrack serialization benchmark
1 parent ae8b5c8 commit 35e5f3f

4 files changed

Lines changed: 155 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: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
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+
for _ in 0..n {
15+
let size = rng.gen_range(8..8192);
16+
let kind = match rng.gen_range(0..8) {
17+
0 => MemtrackEventKind::Malloc { size },
18+
1 => MemtrackEventKind::Free,
19+
2 => MemtrackEventKind::Realloc { size },
20+
3 => MemtrackEventKind::Calloc { size },
21+
4 => MemtrackEventKind::AlignedAlloc { size },
22+
5 => MemtrackEventKind::Mmap { size },
23+
6 => MemtrackEventKind::Munmap { size },
24+
7 => MemtrackEventKind::Brk { size },
25+
_ => unreachable!(),
26+
};
27+
28+
events.push(MemtrackEvent {
29+
pid: rng.r#gen(),
30+
tid: rng.r#gen(),
31+
timestamp: rng.r#gen(),
32+
addr: rng.r#gen(),
33+
kind,
34+
});
35+
}
36+
37+
events
38+
}
39+
40+
#[divan::bench(args = [10_000, 100_000, 500_000, 1_000_000])]
41+
fn write_events(bencher: Bencher, n: usize) {
42+
let events = generate_events(n);
43+
44+
bencher.bench_local(|| {
45+
let mut output = Vec::new();
46+
let mut writer = MemtrackWriter::new(&mut output).unwrap();
47+
for event in &events {
48+
writer.write_event(event).unwrap();
49+
}
50+
writer.finish().unwrap();
51+
});
52+
}

0 commit comments

Comments
 (0)