Skip to content

Commit 25255c8

Browse files
committed
Roll in improvements from servo#94
1 parent cc31d1e commit 25255c8

File tree

1 file changed

+62
-21
lines changed

1 file changed

+62
-21
lines changed

benches/bench.rs

Lines changed: 62 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@ use self::test::Bencher;
88
use smallvec::{ExtendFromSlice, SmallVec};
99

1010
const VEC_SIZE: usize = 16;
11+
const SPILLED_SIZE: usize = 100;
1112

1213
trait Vector<T>: for<'a> From<&'a [T]> + Extend<T> + ExtendFromSlice<T> {
1314
fn new() -> Self;
1415
fn push(&mut self, val: T);
1516
fn pop(&mut self) -> Option<T>;
17+
fn remove(&mut self, p: usize) -> T;
1618
fn insert(&mut self, n: usize, val: T);
1719
fn from_elem(val: T, n: usize) -> Self;
1820
}
@@ -21,15 +23,23 @@ impl<T: Copy> Vector<T> for Vec<T> {
2123
fn new() -> Self {
2224
Self::with_capacity(VEC_SIZE)
2325
}
26+
2427
fn push(&mut self, val: T) {
2528
self.push(val)
2629
}
30+
2731
fn pop(&mut self) -> Option<T> {
2832
self.pop()
2933
}
34+
35+
fn remove(&mut self, p: usize) -> T {
36+
self.remove(p)
37+
}
38+
3039
fn insert(&mut self, n: usize, val: T) {
3140
self.insert(n, val)
3241
}
42+
3343
fn from_elem(val: T, n: usize) -> Self {
3444
vec![val; n]
3545
}
@@ -39,15 +49,23 @@ impl<T: Copy> Vector<T> for SmallVec<[T; VEC_SIZE]> {
3949
fn new() -> Self {
4050
Self::new()
4151
}
52+
4253
fn push(&mut self, val: T) {
4354
self.push(val)
4455
}
56+
4557
fn pop(&mut self) -> Option<T> {
4658
self.pop()
4759
}
60+
61+
fn remove(&mut self, p: usize) -> T {
62+
self.remove(p)
63+
}
64+
4865
fn insert(&mut self, n: usize, val: T) {
4966
self.insert(n, val)
5067
}
68+
5169
fn from_elem(val: T, n: usize) -> Self {
5270
smallvec![val; n]
5371
}
@@ -66,35 +84,39 @@ macro_rules! make_benches {
6684

6785
make_benches! {
6886
SmallVec<[u64; VEC_SIZE]> {
69-
bench_push => gen_push(100),
87+
bench_push => gen_push(SPILLED_SIZE as _),
7088
bench_push_small => gen_push(VEC_SIZE as _),
71-
bench_insert => gen_insert(100),
89+
bench_insert => gen_insert(SPILLED_SIZE as _),
7290
bench_insert_small => gen_insert(VEC_SIZE as _),
73-
bench_extend => gen_extend(100),
91+
bench_remove => gen_remove(SPILLED_SIZE as _),
92+
bench_remove_small => gen_remove(VEC_SIZE as _),
93+
bench_extend => gen_extend(SPILLED_SIZE as _),
7494
bench_extend_small => gen_extend(VEC_SIZE as _),
75-
bench_from_slice => gen_from_slice(100),
95+
bench_from_slice => gen_from_slice(SPILLED_SIZE as _),
7696
bench_from_slice_small => gen_from_slice(VEC_SIZE as _),
77-
bench_extend_from_slice => gen_extend_from_slice(100),
97+
bench_extend_from_slice => gen_extend_from_slice(SPILLED_SIZE as _),
7898
bench_extend_from_slice_small => gen_extend_from_slice(VEC_SIZE as _),
79-
bench_macro_from_elem => gen_from_elem(100),
99+
bench_macro_from_elem => gen_from_elem(SPILLED_SIZE as _),
80100
bench_macro_from_elem_small => gen_from_elem(VEC_SIZE as _),
81101
bench_pushpop => gen_pushpop(),
82102
}
83103
}
84104

85105
make_benches! {
86106
Vec<u64> {
87-
bench_push_vec => gen_push(100),
107+
bench_push_vec => gen_push(SPILLED_SIZE as _),
88108
bench_push_vec_small => gen_push(VEC_SIZE as _),
89-
bench_insert_vec => gen_insert(100),
109+
bench_insert_vec => gen_insert(SPILLED_SIZE as _),
90110
bench_insert_vec_small => gen_insert(VEC_SIZE as _),
91-
bench_extend_vec => gen_extend(100),
111+
bench_remove_vec => gen_remove(SPILLED_SIZE as _),
112+
bench_remove_vec_small => gen_remove(VEC_SIZE as _),
113+
bench_extend_vec => gen_extend(SPILLED_SIZE as _),
92114
bench_extend_vec_small => gen_extend(VEC_SIZE as _),
93-
bench_from_slice_vec => gen_from_slice(100),
115+
bench_from_slice_vec => gen_from_slice(SPILLED_SIZE as _),
94116
bench_from_slice_vec_small => gen_from_slice(VEC_SIZE as _),
95-
bench_extend_from_slice_vec => gen_extend_from_slice(100),
117+
bench_extend_from_slice_vec => gen_extend_from_slice(SPILLED_SIZE as _),
96118
bench_extend_from_slice_vec_small => gen_extend_from_slice(VEC_SIZE as _),
97-
bench_macro_from_elem_vec => gen_from_elem(100),
119+
bench_macro_from_elem_vec => gen_from_elem(SPILLED_SIZE as _),
98120
bench_macro_from_elem_vec_small => gen_from_elem(VEC_SIZE as _),
99121
bench_pushpop_vec => gen_pushpop(),
100122
}
@@ -117,19 +139,38 @@ fn gen_push<V: Vector<u64>>(n: u64, b: &mut Bencher) {
117139

118140
fn gen_insert<V: Vector<u64>>(n: u64, b: &mut Bencher) {
119141
#[inline(never)]
120-
fn insert_noinline<V: Vector<u64>>(vec: &mut V, x: u64) {
121-
vec.insert(0, x)
142+
fn insert_noinline<V: Vector<u64>>(vec: &mut V, p: usize, x: u64) {
143+
vec.insert(p, x)
122144
}
123145

124146
b.iter(|| {
125147
let mut vec = V::new();
148+
// Add one element, with each iteration we insert one before the end.
149+
// This means that we benchmark the insertion operation and not the
150+
// time it takes to `ptr::copy` the data.
151+
vec.push(0);
126152
for x in 0..n {
127-
insert_noinline(&mut vec, x);
153+
insert_noinline(&mut vec, x as _, x);
128154
}
129155
vec
130156
});
131157
}
132158

159+
fn gen_remove<V: Vector<u64>>(n: usize, b: &mut Bencher) {
160+
#[inline(never)]
161+
fn remove_noinline<V: Vector<u64>>(vec: &mut V, p: usize) {
162+
vec.remove(p);
163+
}
164+
165+
b.iter(|| {
166+
let mut vec = V::from_elem(0, n as _);
167+
168+
for x in (0..n - 1).rev() {
169+
remove_noinline(&mut vec, x)
170+
}
171+
});
172+
}
173+
133174
fn gen_extend<V: Vector<u64>>(n: u64, b: &mut Bencher) {
134175
b.iter(|| {
135176
let mut vec = V::new();
@@ -157,14 +198,14 @@ fn gen_extend_from_slice<V: Vector<u64>>(n: u64, b: &mut Bencher) {
157198

158199
fn gen_pushpop<V: Vector<u64>>(b: &mut Bencher) {
159200
#[inline(never)]
160-
fn pushpop_noinline<V: Vector<u64>>(vec: &mut V, x: u64) {
201+
fn pushpop_noinline<V: Vector<u64>>(vec: &mut V, x: u64) -> Option<u64> {
161202
vec.push(x);
162-
vec.pop();
203+
vec.pop()
163204
}
164205

165206
b.iter(|| {
166207
let mut vec = V::new();
167-
for x in 0..100 {
208+
for x in 0..SPILLED_SIZE as _ {
168209
pushpop_noinline(&mut vec, x);
169210
}
170211
vec
@@ -191,15 +232,15 @@ fn bench_insert_many(b: &mut Bencher) {
191232

192233
b.iter(|| {
193234
let mut vec = SmallVec::<[u64; VEC_SIZE]>::new();
194-
insert_many_noinline(&mut vec, 0, 0..100);
195-
insert_many_noinline(&mut vec, 0, 0..100);
235+
insert_many_noinline(&mut vec, 0, 0..SPILLED_SIZE as _);
236+
insert_many_noinline(&mut vec, 0, 0..SPILLED_SIZE as _);
196237
vec
197238
});
198239
}
199240

200241
#[bench]
201242
fn bench_insert_from_slice(b: &mut Bencher) {
202-
let v: Vec<u64> = (0..100).collect();
243+
let v: Vec<u64> = (0..SPILLED_SIZE as _).collect();
203244
b.iter(|| {
204245
let mut vec = SmallVec::<[u64; VEC_SIZE]>::new();
205246
vec.insert_from_slice(0, &v);

0 commit comments

Comments
 (0)