Skip to content

Commit 454d208

Browse files
authored
Merge pull request #72 from Amanieu/bench
Replace benchmarks with (slightly) better ones
2 parents cad5319 + 32395a4 commit 454d208

File tree

1 file changed

+66
-75
lines changed

1 file changed

+66
-75
lines changed

benches/bench.rs

Lines changed: 66 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
extern crate test;
44

55
use std::hash::Hash;
6-
use test::Bencher;
6+
use test::{black_box, Bencher};
77

88
use hashbrown::HashMap;
99
//use rustc_hash::FxHashMap as HashMap;
@@ -14,146 +14,137 @@ fn new_map<K: Eq + Hash, V>() -> HashMap<K, V> {
1414
}
1515

1616
#[bench]
17-
fn new_drop(b: &mut Bencher) {
17+
fn insert_i32(b: &mut Bencher) {
1818
b.iter(|| {
19-
let m: HashMap<i32, i32> = new_map();
20-
assert_eq!(m.len(), 0);
19+
let mut m: HashMap<i32, i32> = new_map();
20+
for i in 1..1001 {
21+
m.insert(i, i);
22+
}
23+
black_box(m);
2124
})
2225
}
2326

2427
#[bench]
25-
fn new_insert_drop(b: &mut Bencher) {
28+
fn insert_i64(b: &mut Bencher) {
2629
b.iter(|| {
27-
let mut m = new_map();
28-
m.insert(0, 0);
29-
assert_eq!(m.len(), 1);
30+
let mut m: HashMap<i64, i64> = new_map();
31+
for i in 1..1001 {
32+
m.insert(i, i);
33+
}
34+
black_box(m);
3035
})
3136
}
3237

3338
#[bench]
34-
fn grow_by_insertion(b: &mut Bencher) {
35-
let mut m = new_map();
36-
37-
for i in 1..1001 {
38-
m.insert(i, i);
39-
}
40-
41-
let mut k = 1001;
42-
39+
fn insert_erase_i32(b: &mut Bencher) {
4340
b.iter(|| {
44-
m.insert(k, k);
45-
k += 1;
46-
});
41+
let mut m: HashMap<i32, i32> = new_map();
42+
for i in 1..1001 {
43+
m.insert(i, i);
44+
}
45+
black_box(&mut m);
46+
for i in 1..1001 {
47+
m.remove(&i);
48+
}
49+
black_box(m);
50+
})
4751
}
4852

4953
#[bench]
50-
fn grow_by_insertion_kb(b: &mut Bencher) {
51-
let mut m = new_map();
52-
let kb = 1024;
53-
for i in 1..1001 {
54-
m.insert(i * kb, i);
55-
}
56-
57-
let mut k = 1001 * kb;
58-
54+
fn insert_erase_i64(b: &mut Bencher) {
5955
b.iter(|| {
60-
m.insert(k, k);
61-
k += kb;
62-
});
56+
let mut m: HashMap<i64, i64> = new_map();
57+
for i in 1..1001 {
58+
m.insert(i, i);
59+
}
60+
black_box(&mut m);
61+
for i in 1..1001 {
62+
m.remove(&i);
63+
}
64+
black_box(m);
65+
})
6366
}
6467

6568
#[bench]
66-
fn find_existing(b: &mut Bencher) {
67-
let mut m = new_map();
68-
69+
fn lookup_i32(b: &mut Bencher) {
70+
let mut m: HashMap<i32, i32> = new_map();
6971
for i in 1..1001 {
7072
m.insert(i, i);
7173
}
7274

7375
b.iter(|| {
7476
for i in 1..1001 {
75-
m.contains_key(&i);
77+
black_box(m.get(&i));
7678
}
77-
});
79+
})
7880
}
7981

8082
#[bench]
81-
fn find_existing_high_bits(b: &mut Bencher) {
82-
let mut m = new_map();
83-
84-
for i in 1..1001_u64 {
85-
m.insert(i << 32, i);
83+
fn lookup_i64(b: &mut Bencher) {
84+
let mut m: HashMap<i64, i64> = new_map();
85+
for i in 1..1001 {
86+
m.insert(i, i);
8687
}
8788

8889
b.iter(|| {
89-
for i in 1..1001_u64 {
90-
m.contains_key(&(i << 32));
90+
for i in 1..1001 {
91+
black_box(m.get(&i));
9192
}
92-
});
93+
})
9394
}
9495

9596
#[bench]
96-
fn find_nonexisting(b: &mut Bencher) {
97-
let mut m = new_map();
98-
97+
fn lookup_fail_i32(b: &mut Bencher) {
98+
let mut m: HashMap<i32, i32> = new_map();
9999
for i in 1..1001 {
100100
m.insert(i, i);
101101
}
102102

103103
b.iter(|| {
104104
for i in 1001..2001 {
105-
m.contains_key(&i);
105+
black_box(m.get(&i));
106106
}
107-
});
107+
})
108108
}
109109

110110
#[bench]
111-
fn hashmap_as_queue(b: &mut Bencher) {
112-
let mut m = new_map();
113-
111+
fn lookup_fail_i64(b: &mut Bencher) {
112+
let mut m: HashMap<i64, i64> = new_map();
114113
for i in 1..1001 {
115114
m.insert(i, i);
116115
}
117116

118-
let mut k = 1;
119-
120117
b.iter(|| {
121-
m.remove(&k);
122-
m.insert(k + 1000, k + 1000);
123-
k += 1;
124-
});
118+
for i in 1001..2001 {
119+
black_box(m.get(&i));
120+
}
121+
})
125122
}
126123

127124
#[bench]
128-
fn get_remove_insert(b: &mut Bencher) {
129-
let mut m = new_map();
130-
125+
fn iter_i32(b: &mut Bencher) {
126+
let mut m: HashMap<i32, i32> = new_map();
131127
for i in 1..1001 {
132128
m.insert(i, i);
133129
}
134130

135-
let mut k = 1;
136-
137131
b.iter(|| {
138-
m.get(&(k + 400));
139-
m.get(&(k + 2000));
140-
m.remove(&k);
141-
m.insert(k + 1000, k + 1000);
142-
k += 1;
132+
for i in &m {
133+
black_box(i);
134+
}
143135
})
144136
}
145137

146138
#[bench]
147-
fn insert_8_char_string(b: &mut Bencher) {
148-
let mut strings: Vec<_> = Vec::new();
139+
fn iter_i64(b: &mut Bencher) {
140+
let mut m: HashMap<i64, i64> = new_map();
149141
for i in 1..1001 {
150-
strings.push(format!("{:x}", -i));
142+
m.insert(i, i);
151143
}
152144

153-
let mut m = new_map();
154145
b.iter(|| {
155-
for key in &strings {
156-
m.insert(key, key);
146+
for i in &m {
147+
black_box(i);
157148
}
158149
})
159150
}

0 commit comments

Comments
 (0)