Skip to content

Commit b56b239

Browse files
committed
Auto merge of #66393 - ssomers:hash_benches, r=dtolnay
introduce benchmarks of HashSet operations To avoid goofs such as corrected by #66280, I added benchmarks of binary HashSet operations. Due to the fact x.py keeps recompiling the whole shebang (or at least a big part of it) whenever you touch the test code, and because piling up all tests in one file does not strike me as future proof, I tried moving the hash benches to the separate place they are for liballoc/collections/btree. But it turns out that, in a cleaned checkout, x.py still recompiles the whole shebang whenever you touch the test code (PS or when you add or delete any irrelevant file). So I'm not going to add more tests, and I doubt others will, and these tests have proven their point already, so this PR is kind of pointless
2 parents 7d761fe + 4decb58 commit b56b239

File tree

6 files changed

+52
-21
lines changed

6 files changed

+52
-21
lines changed

src/liballoc/benches/btree/set.rs

+2-6
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::collections::BTreeSet;
22

33
use rand::{thread_rng, Rng};
4-
use test::{black_box, Bencher};
4+
use test::Bencher;
55

66
fn random(n: usize) -> BTreeSet<usize> {
77
let mut rng = thread_rng();
@@ -31,7 +31,6 @@ fn pos(n: usize) -> BTreeSet<i32> {
3131
set
3232
}
3333

34-
3534
fn stagger(n1: usize, factor: usize) -> [BTreeSet<u32>; 2] {
3635
let n2 = n1 * factor;
3736
let mut sets = [BTreeSet::new(), BTreeSet::new()];
@@ -52,10 +51,7 @@ macro_rules! set_bench {
5251
let sets = $sets;
5352

5453
// measure
55-
b.iter(|| {
56-
let x = sets[0].$set_func(&sets[1]).$result_func();
57-
black_box(x);
58-
})
54+
b.iter(|| sets[0].$set_func(&sets[1]).$result_func())
5955
}
6056
};
6157
}

src/libstd/collections/hash/bench.rs src/libstd/benches/hash/map.rs

+1-14
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
#![cfg(test)]
22

33
use test::Bencher;
4+
use std::collections::HashMap;
45

56
#[bench]
67
fn new_drop(b: &mut Bencher) {
7-
use super::map::HashMap;
8-
98
b.iter(|| {
109
let m: HashMap<i32, i32> = HashMap::new();
1110
assert_eq!(m.len(), 0);
@@ -14,8 +13,6 @@ fn new_drop(b: &mut Bencher) {
1413

1514
#[bench]
1615
fn new_insert_drop(b: &mut Bencher) {
17-
use super::map::HashMap;
18-
1916
b.iter(|| {
2017
let mut m = HashMap::new();
2118
m.insert(0, 0);
@@ -25,8 +22,6 @@ fn new_insert_drop(b: &mut Bencher) {
2522

2623
#[bench]
2724
fn grow_by_insertion(b: &mut Bencher) {
28-
use super::map::HashMap;
29-
3025
let mut m = HashMap::new();
3126

3227
for i in 1..1001 {
@@ -43,8 +38,6 @@ fn grow_by_insertion(b: &mut Bencher) {
4338

4439
#[bench]
4540
fn find_existing(b: &mut Bencher) {
46-
use super::map::HashMap;
47-
4841
let mut m = HashMap::new();
4942

5043
for i in 1..1001 {
@@ -60,8 +53,6 @@ fn find_existing(b: &mut Bencher) {
6053

6154
#[bench]
6255
fn find_nonexisting(b: &mut Bencher) {
63-
use super::map::HashMap;
64-
6556
let mut m = HashMap::new();
6657

6758
for i in 1..1001 {
@@ -77,8 +68,6 @@ fn find_nonexisting(b: &mut Bencher) {
7768

7869
#[bench]
7970
fn hashmap_as_queue(b: &mut Bencher) {
80-
use super::map::HashMap;
81-
8271
let mut m = HashMap::new();
8372

8473
for i in 1..1001 {
@@ -96,8 +85,6 @@ fn hashmap_as_queue(b: &mut Bencher) {
9685

9786
#[bench]
9887
fn get_remove_insert(b: &mut Bencher) {
99-
use super::map::HashMap;
100-
10188
let mut m = HashMap::new();
10289

10390
for i in 1..1001 {

src/libstd/benches/hash/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
mod map;
2+
mod set_ops;

src/libstd/benches/hash/set_ops.rs

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
use std::collections::HashSet;
2+
use test::Bencher;
3+
4+
#[bench]
5+
fn set_difference(b: &mut Bencher) {
6+
let small: HashSet<_> = (0..10).collect();
7+
let large: HashSet<_> = (0..100).collect();
8+
9+
b.iter(|| small.difference(&large).count());
10+
}
11+
12+
#[bench]
13+
fn set_is_subset(b: &mut Bencher) {
14+
let small: HashSet<_> = (0..10).collect();
15+
let large: HashSet<_> = (0..100).collect();
16+
17+
b.iter(|| small.is_subset(&large));
18+
}
19+
20+
#[bench]
21+
fn set_intersection(b: &mut Bencher) {
22+
let small: HashSet<_> = (0..10).collect();
23+
let large: HashSet<_> = (0..100).collect();
24+
25+
b.iter(|| small.intersection(&large).count());
26+
}
27+
28+
#[bench]
29+
fn set_symmetric_difference(b: &mut Bencher) {
30+
let small: HashSet<_> = (0..10).collect();
31+
let large: HashSet<_> = (0..100).collect();
32+
33+
b.iter(|| small.symmetric_difference(&large).count());
34+
}
35+
36+
#[bench]
37+
fn set_union(b: &mut Bencher) {
38+
let small: HashSet<_> = (0..10).collect();
39+
let large: HashSet<_> = (0..100).collect();
40+
41+
b.iter(|| small.union(&large).count());
42+
}

src/libstd/benches/lib.rs

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#![feature(test)]
2+
3+
extern crate test;
4+
5+
mod hash;

src/libstd/collections/hash/mod.rs

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
//! Unordered containers, implemented as hash-tables
22
3-
mod bench;
43
pub mod map;
54
pub mod set;

0 commit comments

Comments
 (0)