about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2019-11-24 10:52:12 +0000
committerbors <bors@rust-lang.org>2019-11-24 10:52:12 +0000
commitb56b23988de532744fd05301f87c329b612700e3 (patch)
treea984f7a4ce51ccf1633473096635d2e71897ef94
parent7d761fe0462ba0f671a237d0bb35e3579b8ba0e8 (diff)
parent4decb58a64fd3d0a0da5cbea4a77327996cbe44a (diff)
downloadrust-b56b23988de532744fd05301f87c329b612700e3.tar.gz
rust-b56b23988de532744fd05301f87c329b612700e3.zip
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
-rw-r--r--src/liballoc/benches/btree/set.rs8
-rw-r--r--src/libstd/benches/hash/map.rs (renamed from src/libstd/collections/hash/bench.rs)15
-rw-r--r--src/libstd/benches/hash/mod.rs2
-rw-r--r--src/libstd/benches/hash/set_ops.rs42
-rw-r--r--src/libstd/benches/lib.rs5
-rw-r--r--src/libstd/collections/hash/mod.rs1
6 files changed, 52 insertions, 21 deletions
diff --git a/src/liballoc/benches/btree/set.rs b/src/liballoc/benches/btree/set.rs
index 6357ea3ea11..18502ded308 100644
--- a/src/liballoc/benches/btree/set.rs
+++ b/src/liballoc/benches/btree/set.rs
@@ -1,7 +1,7 @@
 use std::collections::BTreeSet;
 
 use rand::{thread_rng, Rng};
-use test::{black_box, Bencher};
+use test::Bencher;
 
 fn random(n: usize) -> BTreeSet<usize> {
     let mut rng = thread_rng();
@@ -31,7 +31,6 @@ fn pos(n: usize) -> BTreeSet<i32> {
     set
 }
 
-
 fn stagger(n1: usize, factor: usize) -> [BTreeSet<u32>; 2] {
     let n2 = n1 * factor;
     let mut sets = [BTreeSet::new(), BTreeSet::new()];
@@ -52,10 +51,7 @@ macro_rules! set_bench {
             let sets = $sets;
 
             // measure
-            b.iter(|| {
-                let x = sets[0].$set_func(&sets[1]).$result_func();
-                black_box(x);
-            })
+            b.iter(|| sets[0].$set_func(&sets[1]).$result_func())
         }
     };
 }
diff --git a/src/libstd/collections/hash/bench.rs b/src/libstd/benches/hash/map.rs
index 7f5add05436..25425c5968e 100644
--- a/src/libstd/collections/hash/bench.rs
+++ b/src/libstd/benches/hash/map.rs
@@ -1,11 +1,10 @@
 #![cfg(test)]
 
 use test::Bencher;
+use std::collections::HashMap;
 
 #[bench]
 fn new_drop(b: &mut Bencher) {
-    use super::map::HashMap;
-
     b.iter(|| {
         let m: HashMap<i32, i32> = HashMap::new();
         assert_eq!(m.len(), 0);
@@ -14,8 +13,6 @@ fn new_drop(b: &mut Bencher) {
 
 #[bench]
 fn new_insert_drop(b: &mut Bencher) {
-    use super::map::HashMap;
-
     b.iter(|| {
         let mut m = HashMap::new();
         m.insert(0, 0);
@@ -25,8 +22,6 @@ fn new_insert_drop(b: &mut Bencher) {
 
 #[bench]
 fn grow_by_insertion(b: &mut Bencher) {
-    use super::map::HashMap;
-
     let mut m = HashMap::new();
 
     for i in 1..1001 {
@@ -43,8 +38,6 @@ fn grow_by_insertion(b: &mut Bencher) {
 
 #[bench]
 fn find_existing(b: &mut Bencher) {
-    use super::map::HashMap;
-
     let mut m = HashMap::new();
 
     for i in 1..1001 {
@@ -60,8 +53,6 @@ fn find_existing(b: &mut Bencher) {
 
 #[bench]
 fn find_nonexisting(b: &mut Bencher) {
-    use super::map::HashMap;
-
     let mut m = HashMap::new();
 
     for i in 1..1001 {
@@ -77,8 +68,6 @@ fn find_nonexisting(b: &mut Bencher) {
 
 #[bench]
 fn hashmap_as_queue(b: &mut Bencher) {
-    use super::map::HashMap;
-
     let mut m = HashMap::new();
 
     for i in 1..1001 {
@@ -96,8 +85,6 @@ fn hashmap_as_queue(b: &mut Bencher) {
 
 #[bench]
 fn get_remove_insert(b: &mut Bencher) {
-    use super::map::HashMap;
-
     let mut m = HashMap::new();
 
     for i in 1..1001 {
diff --git a/src/libstd/benches/hash/mod.rs b/src/libstd/benches/hash/mod.rs
new file mode 100644
index 00000000000..42401a21b76
--- /dev/null
+++ b/src/libstd/benches/hash/mod.rs
@@ -0,0 +1,2 @@
+mod map;
+mod set_ops;
diff --git a/src/libstd/benches/hash/set_ops.rs b/src/libstd/benches/hash/set_ops.rs
new file mode 100644
index 00000000000..1a4c4a66ee9
--- /dev/null
+++ b/src/libstd/benches/hash/set_ops.rs
@@ -0,0 +1,42 @@
+use std::collections::HashSet;
+use test::Bencher;
+
+#[bench]
+fn set_difference(b: &mut Bencher) {
+    let small: HashSet<_> = (0..10).collect();
+    let large: HashSet<_> = (0..100).collect();
+
+    b.iter(|| small.difference(&large).count());
+}
+
+#[bench]
+fn set_is_subset(b: &mut Bencher) {
+    let small: HashSet<_> = (0..10).collect();
+    let large: HashSet<_> = (0..100).collect();
+
+    b.iter(|| small.is_subset(&large));
+}
+
+#[bench]
+fn set_intersection(b: &mut Bencher) {
+    let small: HashSet<_> = (0..10).collect();
+    let large: HashSet<_> = (0..100).collect();
+
+    b.iter(|| small.intersection(&large).count());
+}
+
+#[bench]
+fn set_symmetric_difference(b: &mut Bencher) {
+    let small: HashSet<_> = (0..10).collect();
+    let large: HashSet<_> = (0..100).collect();
+
+    b.iter(|| small.symmetric_difference(&large).count());
+}
+
+#[bench]
+fn set_union(b: &mut Bencher) {
+    let small: HashSet<_> = (0..10).collect();
+    let large: HashSet<_> = (0..100).collect();
+
+    b.iter(|| small.union(&large).count());
+}
diff --git a/src/libstd/benches/lib.rs b/src/libstd/benches/lib.rs
new file mode 100644
index 00000000000..4d1cf7fab7b
--- /dev/null
+++ b/src/libstd/benches/lib.rs
@@ -0,0 +1,5 @@
+#![feature(test)]
+
+extern crate test;
+
+mod hash;
diff --git a/src/libstd/collections/hash/mod.rs b/src/libstd/collections/hash/mod.rs
index a6d89a4d32a..348820af54b 100644
--- a/src/libstd/collections/hash/mod.rs
+++ b/src/libstd/collections/hash/mod.rs
@@ -1,5 +1,4 @@
 //! Unordered containers, implemented as hash-tables
 
-mod bench;
 pub mod map;
 pub mod set;