Skip to content

Commit 8b47f10

Browse files
Rollup merge of #104097 - RalfJung:miri-alloc-benches, r=thomcc
run alloc benchmarks in Miri and fix UB Miri since recently has a "fake monotonic clock" that works even with isolation. Its measurements are not very meaningful but it means we can run these benches and check them for UB. And that's a good thing since there was UB here: fixes rust-lang/rust#104096. r? ``@thomcc``
2 parents bf3e5d5 + d4ec570 commit 8b47f10

File tree

2 files changed

+19
-16
lines changed

2 files changed

+19
-16
lines changed

alloc/src/alloc/tests.rs

-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ fn allocate_zeroed() {
2222
}
2323

2424
#[bench]
25-
#[cfg_attr(miri, ignore)] // isolated Miri does not support benchmarks
2625
fn alloc_owned_small(b: &mut Bencher) {
2726
b.iter(|| {
2827
let _: Box<_> = Box::new(10);

alloc/src/collections/vec_deque/tests.rs

+19-15
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ use core::iter::TrustedLen;
33
use super::*;
44

55
#[bench]
6-
#[cfg_attr(miri, ignore)] // isolated Miri does not support benchmarks
76
fn bench_push_back_100(b: &mut test::Bencher) {
87
let mut deq = VecDeque::with_capacity(101);
98
b.iter(|| {
@@ -16,7 +15,6 @@ fn bench_push_back_100(b: &mut test::Bencher) {
1615
}
1716

1817
#[bench]
19-
#[cfg_attr(miri, ignore)] // isolated Miri does not support benchmarks
2018
fn bench_push_front_100(b: &mut test::Bencher) {
2119
let mut deq = VecDeque::with_capacity(101);
2220
b.iter(|| {
@@ -29,12 +27,15 @@ fn bench_push_front_100(b: &mut test::Bencher) {
2927
}
3028

3129
#[bench]
32-
#[cfg_attr(miri, ignore)] // isolated Miri does not support benchmarks
3330
fn bench_pop_back_100(b: &mut test::Bencher) {
34-
let mut deq = VecDeque::<i32>::with_capacity(101);
31+
let size = 100;
32+
let mut deq = VecDeque::<i32>::with_capacity(size + 1);
33+
// We'll mess with private state to pretend like `deq` is filled.
34+
// Make sure the buffer is initialized so that we don't read uninit memory.
35+
unsafe { deq.ptr().write_bytes(0u8, size + 1) };
3536

3637
b.iter(|| {
37-
deq.head = 100;
38+
deq.head = size;
3839
deq.tail = 0;
3940
while !deq.is_empty() {
4041
test::black_box(deq.pop_back());
@@ -43,9 +44,9 @@ fn bench_pop_back_100(b: &mut test::Bencher) {
4344
}
4445

4546
#[bench]
46-
#[cfg_attr(miri, ignore)] // isolated Miri does not support benchmarks
4747
fn bench_retain_whole_10000(b: &mut test::Bencher) {
48-
let v = (1..100000).collect::<VecDeque<u32>>();
48+
let size = if cfg!(miri) { 1000 } else { 100000 };
49+
let v = (1..size).collect::<VecDeque<u32>>();
4950

5051
b.iter(|| {
5152
let mut v = v.clone();
@@ -54,9 +55,9 @@ fn bench_retain_whole_10000(b: &mut test::Bencher) {
5455
}
5556

5657
#[bench]
57-
#[cfg_attr(miri, ignore)] // isolated Miri does not support benchmarks
5858
fn bench_retain_odd_10000(b: &mut test::Bencher) {
59-
let v = (1..100000).collect::<VecDeque<u32>>();
59+
let size = if cfg!(miri) { 1000 } else { 100000 };
60+
let v = (1..size).collect::<VecDeque<u32>>();
6061

6162
b.iter(|| {
6263
let mut v = v.clone();
@@ -65,23 +66,26 @@ fn bench_retain_odd_10000(b: &mut test::Bencher) {
6566
}
6667

6768
#[bench]
68-
#[cfg_attr(miri, ignore)] // isolated Miri does not support benchmarks
6969
fn bench_retain_half_10000(b: &mut test::Bencher) {
70-
let v = (1..100000).collect::<VecDeque<u32>>();
70+
let size = if cfg!(miri) { 1000 } else { 100000 };
71+
let v = (1..size).collect::<VecDeque<u32>>();
7172

7273
b.iter(|| {
7374
let mut v = v.clone();
74-
v.retain(|x| *x > 50000)
75+
v.retain(|x| *x > size / 2)
7576
})
7677
}
7778

7879
#[bench]
79-
#[cfg_attr(miri, ignore)] // isolated Miri does not support benchmarks
8080
fn bench_pop_front_100(b: &mut test::Bencher) {
81-
let mut deq = VecDeque::<i32>::with_capacity(101);
81+
let size = 100;
82+
let mut deq = VecDeque::<i32>::with_capacity(size + 1);
83+
// We'll mess with private state to pretend like `deq` is filled.
84+
// Make sure the buffer is initialized so that we don't read uninit memory.
85+
unsafe { deq.ptr().write_bytes(0u8, size + 1) };
8286

8387
b.iter(|| {
84-
deq.head = 100;
88+
deq.head = size;
8589
deq.tail = 0;
8690
while !deq.is_empty() {
8791
test::black_box(deq.pop_front());

0 commit comments

Comments
 (0)