Skip to content

Commit 7a52621

Browse files
committed
benches: Add benchmarks for mem* functions
This allows comparing the "normal" implementations to the implementations provided by this crate. Signed-off-by: Joe Richey <[email protected]>
1 parent 844b730 commit 7a52621

File tree

1 file changed

+154
-0
lines changed

1 file changed

+154
-0
lines changed

testcrate/benches/mem.rs

+154
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
#![feature(test)]
2+
3+
extern crate test;
4+
use test::{black_box, Bencher};
5+
6+
extern crate compiler_builtins;
7+
use compiler_builtins::mem::{memcmp, memcpy, memset, memmove};
8+
9+
fn memcpy_builtin(b: &mut Bencher, n: usize) {
10+
let v1 = vec![1u8; n];
11+
let mut v2 = vec![0u8; n];
12+
b.iter(|| {
13+
let src: &[u8] = black_box(&v1);
14+
let dst: &mut [u8] = black_box(&mut v2);
15+
dst.copy_from_slice(src);
16+
})
17+
}
18+
19+
fn memcpy_rust(b: &mut Bencher, n: usize) {
20+
let v1 = vec![1u8; n];
21+
let mut v2 = vec![0u8; n];
22+
b.iter(|| {
23+
let src: &[u8] = black_box(&v1);
24+
let dst: &mut [u8] = black_box(&mut v2);
25+
unsafe { memcpy(dst.as_mut_ptr(), src.as_ptr(), n) }
26+
})
27+
}
28+
29+
fn memset_builtin(b: &mut Bencher, n: usize) {
30+
let mut v1 = vec![0u8; n];
31+
b.iter(|| {
32+
let dst: &mut [u8] = black_box(&mut v1);
33+
let val: u8 = black_box(27);
34+
for b in dst {
35+
*b = val;
36+
}
37+
})
38+
}
39+
40+
fn memset_rust(b: &mut Bencher, n: usize) {
41+
let mut v1 = vec![0u8; n];
42+
b.iter(|| {
43+
let dst: &mut [u8] = black_box(&mut v1);
44+
let val = black_box(27);
45+
unsafe { memset(dst.as_mut_ptr(), val, n) }
46+
})
47+
}
48+
49+
fn memcmp_builtin(b: &mut Bencher, n: usize) {
50+
let v1 = vec![0u8; n];
51+
let mut v2 = vec![0u8; n];
52+
v2[n - 1] = 1;
53+
b.iter(|| {
54+
let s1: &[u8] = black_box(&v1);
55+
let s2: &[u8] = black_box(&v2);
56+
s1.cmp(s2)
57+
})
58+
}
59+
60+
fn memcmp_rust(b: &mut Bencher, n: usize) {
61+
let v1 = vec![0u8; n];
62+
let mut v2 = vec![0u8; n];
63+
v2[n - 1] = 1;
64+
b.iter(|| {
65+
let s1: &[u8] = black_box(&v1);
66+
let s2: &[u8] = black_box(&v2);
67+
unsafe { memcmp(s1.as_ptr(), s2.as_ptr(), n) }
68+
})
69+
}
70+
71+
fn memmove_builtin(b: &mut Bencher, n: usize) {
72+
let mut v = vec![0u8; n+n/2];
73+
b.iter(|| {
74+
let s: &mut [u8] = black_box(&mut v);
75+
s.copy_within(0..n, n/2);
76+
})
77+
}
78+
79+
fn memmove_rust(b: &mut Bencher, n: usize) {
80+
let mut v = vec![0u8; n+n/2];
81+
b.iter(|| {
82+
let dst: *mut u8 = black_box(&mut v[n/2..]).as_mut_ptr();
83+
let src: *const u8 = black_box(&v).as_ptr();
84+
unsafe { memmove(dst, src, n) };
85+
})
86+
}
87+
88+
#[bench]
89+
fn memcpy_builtin_4096(b: &mut Bencher) {
90+
memcpy_builtin(b, 4096)
91+
}
92+
#[bench]
93+
fn memcpy_rust_4096(b: &mut Bencher) {
94+
memcpy_rust(b, 4096)
95+
}
96+
#[bench]
97+
fn memcpy_builtin_1048576(b: &mut Bencher) {
98+
memcpy_builtin(b, 1048576)
99+
}
100+
#[bench]
101+
fn memcpy_rust_1048576(b: &mut Bencher) {
102+
memcpy_rust(b, 1048576)
103+
}
104+
105+
#[bench]
106+
fn memset_builtin_4096(b: &mut Bencher) {
107+
memset_builtin(b, 4096)
108+
}
109+
#[bench]
110+
fn memset_rust_4096(b: &mut Bencher) {
111+
memset_rust(b, 4096)
112+
}
113+
#[bench]
114+
fn memset_builtin_1048576(b: &mut Bencher) {
115+
memset_builtin(b, 1048576)
116+
}
117+
#[bench]
118+
fn memset_rust_1048576(b: &mut Bencher) {
119+
memset_rust(b, 1048576)
120+
}
121+
122+
#[bench]
123+
fn memcmp_builtin_4096(b: &mut Bencher) {
124+
memcmp_builtin(b, 4096)
125+
}
126+
#[bench]
127+
fn memcmp_rust_4096(b: &mut Bencher) {
128+
memcmp_rust(b, 4096)
129+
}
130+
#[bench]
131+
fn memcmp_builtin_1048576(b: &mut Bencher) {
132+
memcmp_builtin(b, 1048576)
133+
}
134+
#[bench]
135+
fn memcmp_rust_1048576(b: &mut Bencher) {
136+
memcmp_rust(b, 1048576)
137+
}
138+
139+
#[bench]
140+
fn memmove_builtin_4096(b: &mut Bencher) {
141+
memmove_builtin(b, 4096)
142+
}
143+
#[bench]
144+
fn memmove_rust_4096(b: &mut Bencher) {
145+
memmove_rust(b, 4096)
146+
}
147+
#[bench]
148+
fn memmove_builtin_1048576(b: &mut Bencher) {
149+
memmove_builtin(b, 1048576)
150+
}
151+
#[bench]
152+
fn memmove_rust_1048576(b: &mut Bencher) {
153+
memmove_rust(b, 1048576)
154+
}

0 commit comments

Comments
 (0)