Skip to content

Commit 8c88418

Browse files
committed
Try to make Vec benchmarks only run code they are benchmarking
Many of the Vec benchmarks assert what values should be produced by the benchmarked code. In some cases, these asserts dominate the runtime of the benchmarks they are in, causing the benchmarks to understate the impact of an optimization or regression.
1 parent 07e0e2e commit 8c88418

File tree

1 file changed

+25
-68
lines changed

1 file changed

+25
-68
lines changed

library/alloc/benches/vec.rs

+25-68
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,13 @@ use test::{black_box, Bencher};
44

55
#[bench]
66
fn bench_new(b: &mut Bencher) {
7-
b.iter(|| {
8-
let v: Vec<u32> = Vec::new();
9-
assert_eq!(v.len(), 0);
10-
assert_eq!(v.capacity(), 0);
11-
v
12-
})
7+
b.iter(|| Vec::<u32>::new())
138
}
149

1510
fn do_bench_with_capacity(b: &mut Bencher, src_len: usize) {
1611
b.bytes = src_len as u64;
1712

18-
b.iter(|| {
19-
let v: Vec<u32> = Vec::with_capacity(src_len);
20-
assert_eq!(v.len(), 0);
21-
assert_eq!(v.capacity(), src_len);
22-
v
23-
})
13+
b.iter(|| Vec::<u32>::with_capacity(src_len))
2414
}
2515

2616
#[bench]
@@ -46,12 +36,7 @@ fn bench_with_capacity_1000(b: &mut Bencher) {
4636
fn do_bench_from_fn(b: &mut Bencher, src_len: usize) {
4737
b.bytes = src_len as u64;
4838

49-
b.iter(|| {
50-
let dst = (0..src_len).collect::<Vec<_>>();
51-
assert_eq!(dst.len(), src_len);
52-
assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
53-
dst
54-
})
39+
b.iter(|| (0..src_len).collect::<Vec<_>>())
5540
}
5641

5742
#[bench]
@@ -77,12 +62,7 @@ fn bench_from_fn_1000(b: &mut Bencher) {
7762
fn do_bench_from_elem(b: &mut Bencher, src_len: usize) {
7863
b.bytes = src_len as u64;
7964

80-
b.iter(|| {
81-
let dst: Vec<usize> = repeat(5).take(src_len).collect();
82-
assert_eq!(dst.len(), src_len);
83-
assert!(dst.iter().all(|x| *x == 5));
84-
dst
85-
})
65+
b.iter(|| repeat(5).take(src_len).collect::<Vec<usize>>())
8666
}
8767

8868
#[bench]
@@ -110,12 +90,7 @@ fn do_bench_from_slice(b: &mut Bencher, src_len: usize) {
11090

11191
b.bytes = src_len as u64;
11292

113-
b.iter(|| {
114-
let dst = src.clone()[..].to_vec();
115-
assert_eq!(dst.len(), src_len);
116-
assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
117-
dst
118-
});
93+
b.iter(|| src.as_slice().to_vec());
11994
}
12095

12196
#[bench]
@@ -144,9 +119,7 @@ fn do_bench_from_iter(b: &mut Bencher, src_len: usize) {
144119
b.bytes = src_len as u64;
145120

146121
b.iter(|| {
147-
let dst: Vec<_> = FromIterator::from_iter(src.clone());
148-
assert_eq!(dst.len(), src_len);
149-
assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
122+
let dst: Vec<_> = FromIterator::from_iter(src.iter().cloned());
150123
dst
151124
});
152125
}
@@ -180,8 +153,6 @@ fn do_bench_extend(b: &mut Bencher, dst_len: usize, src_len: usize) {
180153
b.iter(|| {
181154
let mut dst = dst.clone();
182155
dst.extend(src.clone());
183-
assert_eq!(dst.len(), dst_len + src_len);
184-
assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
185156
dst
186157
});
187158
}
@@ -230,8 +201,6 @@ fn do_bench_extend_from_slice(b: &mut Bencher, dst_len: usize, src_len: usize) {
230201
b.iter(|| {
231202
let mut dst = dst.clone();
232203
dst.extend_from_slice(&src);
233-
assert_eq!(dst.len(), dst_len + src_len);
234-
assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
235204
dst
236205
});
237206
}
@@ -290,12 +259,7 @@ fn do_bench_clone(b: &mut Bencher, src_len: usize) {
290259

291260
b.bytes = src_len as u64;
292261

293-
b.iter(|| {
294-
let dst = src.clone();
295-
assert_eq!(dst.len(), src_len);
296-
assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
297-
dst
298-
});
262+
b.iter(|| src.clone());
299263
}
300264

301265
#[bench]
@@ -329,8 +293,7 @@ fn do_bench_clone_from(b: &mut Bencher, times: usize, dst_len: usize, src_len: u
329293

330294
for _ in 0..times {
331295
dst.clone_from(&src);
332-
assert_eq!(dst.len(), src_len);
333-
assert!(dst.iter().enumerate().all(|(i, x)| dst_len + i == *x));
296+
dst = black_box(dst);
334297
}
335298
dst
336299
});
@@ -463,11 +426,10 @@ macro_rules! bench_in_place {
463426
fn $fname(b: &mut Bencher) {
464427
b.iter(|| {
465428
let src: Vec<$type> = black_box(vec![$init; $count]);
466-
let mut sink = src.into_iter()
429+
src.into_iter()
467430
.enumerate()
468431
.map(|(idx, e)| idx as $type ^ e)
469-
.collect::<Vec<$type>>();
470-
black_box(sink.as_mut_ptr())
432+
.collect::<Vec<$type>>()
471433
});
472434
}
473435
)+
@@ -527,7 +489,6 @@ fn bench_in_place_zip_recycle(b: &mut Bencher) {
527489
.enumerate()
528490
.map(|(i, (d, s))| d.wrapping_add(i as u8) ^ s)
529491
.collect::<Vec<_>>();
530-
assert_eq!(mangled.len(), 1000);
531492
data = black_box(mangled);
532493
});
533494
}
@@ -614,23 +575,6 @@ fn bench_nest_chain_chain_collect(b: &mut Bencher) {
614575
});
615576
}
616577

617-
pub fn example_plain_slow(l: &[u32]) -> Vec<u32> {
618-
let mut result = Vec::with_capacity(l.len());
619-
result.extend(l.iter().rev());
620-
result
621-
}
622-
623-
pub fn map_fast(l: &[(u32, u32)]) -> Vec<u32> {
624-
let mut result = Vec::with_capacity(l.len());
625-
for i in 0..l.len() {
626-
unsafe {
627-
*result.get_unchecked_mut(i) = l[i].0;
628-
result.set_len(i);
629-
}
630-
}
631-
result
632-
}
633-
634578
#[bench]
635579
fn bench_range_map_collect(b: &mut Bencher) {
636580
b.iter(|| (0..LEN).map(|_| u32::default()).collect::<Vec<_>>());
@@ -669,7 +613,11 @@ fn bench_rev_1(b: &mut Bencher) {
669613
#[bench]
670614
fn bench_rev_2(b: &mut Bencher) {
671615
let data = black_box([0; LEN]);
672-
b.iter(|| example_plain_slow(&data));
616+
b.iter(|| {
617+
let mut v = Vec::<u32>::with_capacity(data.len());
618+
v.extend(data.iter().rev());
619+
v
620+
});
673621
}
674622

675623
#[bench]
@@ -685,7 +633,16 @@ fn bench_map_regular(b: &mut Bencher) {
685633
#[bench]
686634
fn bench_map_fast(b: &mut Bencher) {
687635
let data = black_box([(0, 0); LEN]);
688-
b.iter(|| map_fast(&data));
636+
b.iter(|| {
637+
let mut result = Vec::with_capacity(data.len());
638+
for i in 0..data.len() {
639+
unsafe {
640+
*result.get_unchecked_mut(i) = data[i].0;
641+
result.set_len(i);
642+
}
643+
}
644+
result
645+
});
689646
}
690647

691648
fn random_sorted_fill(mut seed: u32, buf: &mut [u32]) {

0 commit comments

Comments
 (0)