Skip to content

Commit 97ad0fa

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 97ad0fa

File tree

1 file changed

+120
-0
lines changed

1 file changed

+120
-0
lines changed

testcrate/benches/mem.rs

+120
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
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::{memcpy, memset, memcmp};
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+
#[bench]
72+
fn memcpy_builtin_4096(b: &mut Bencher) {
73+
memcpy_builtin(b, 4096)
74+
}
75+
#[bench]
76+
fn memcpy_rust_4096(b: &mut Bencher) {
77+
memcpy_rust(b, 4096)
78+
}
79+
#[bench]
80+
fn memcpy_builtin_1048576(b: &mut Bencher) {
81+
memcpy_builtin(b, 1048576)
82+
}
83+
#[bench]
84+
fn memcpy_rust_1048576(b: &mut Bencher) {
85+
memcpy_rust(b, 1048576)
86+
}
87+
88+
#[bench]
89+
fn memset_builtin_4096(b: &mut Bencher) {
90+
memset_builtin(b, 4096)
91+
}
92+
#[bench]
93+
fn memset_rust_4096(b: &mut Bencher) {
94+
memset_rust(b, 4096)
95+
}
96+
#[bench]
97+
fn memset_builtin_1048576(b: &mut Bencher) {
98+
memset_builtin(b, 1048576)
99+
}
100+
#[bench]
101+
fn memset_rust_1048576(b: &mut Bencher) {
102+
memset_rust(b, 1048576)
103+
}
104+
105+
#[bench]
106+
fn memcmp_builtin_4096(b: &mut Bencher) {
107+
memcmp_builtin(b, 4096)
108+
}
109+
#[bench]
110+
fn memcmp_rust_4096(b: &mut Bencher) {
111+
memcmp_rust(b, 4096)
112+
}
113+
#[bench]
114+
fn memcmp_builtin_1048576(b: &mut Bencher) {
115+
memcmp_builtin(b, 1048576)
116+
}
117+
#[bench]
118+
fn memcmp_rust_1048576(b: &mut Bencher) {
119+
memcmp_rust(b, 1048576)
120+
}

0 commit comments

Comments
 (0)