about summary refs log tree commit diff
diff options
context:
space:
mode:
authorThe8472 <git@infinite-source.de>2019-11-23 18:26:52 +0100
committerThe8472 <git@infinite-source.de>2020-09-03 20:59:18 +0200
commit3d5e9f1904e2c08369bfa7ec3963dab12a76544b (patch)
tree4aa60525412d45cf3a777f74f1d4484a443abf8f
parent2b0b2ae9f61c26338dc00c70eee936230b4b75c0 (diff)
downloadrust-3d5e9f1904e2c08369bfa7ec3963dab12a76544b.tar.gz
rust-3d5e9f1904e2c08369bfa7ec3963dab12a76544b.zip
bench in-place zip
-rw-r--r--library/alloc/benches/vec.rs37
1 files changed, 37 insertions, 0 deletions
diff --git a/library/alloc/benches/vec.rs b/library/alloc/benches/vec.rs
index ea8cd6b5155..a6af316e6a0 100644
--- a/library/alloc/benches/vec.rs
+++ b/library/alloc/benches/vec.rs
@@ -1,3 +1,4 @@
+use rand::prelude::*;
 use std::iter::{repeat, FromIterator};
 use test::{black_box, Bencher};
 
@@ -501,6 +502,42 @@ fn bench_in_place_recycle(b: &mut test::Bencher) {
     });
 }
 
+#[bench]
+fn bench_in_place_zip_recycle(b: &mut test::Bencher) {
+    let mut data = vec![0u8; 256];
+    let mut rng = rand::thread_rng();
+    let mut subst = (0..=255u8).collect::<Vec<_>>();
+    subst.shuffle(&mut rng);
+
+    b.iter(|| {
+        let tmp = std::mem::replace(&mut data, Vec::new());
+        let mangled = tmp
+            .into_iter()
+            .zip(subst.iter().copied())
+            .enumerate()
+            .map(|(i, (d, s))| d.wrapping_add(i as u8) ^ s)
+            .collect::<Vec<_>>();
+        assert_eq!(mangled.len(), 256);
+        std::mem::replace(&mut data, black_box(mangled));
+    });
+}
+
+#[bench]
+fn bench_in_place_zip_iter_mut(b: &mut test::Bencher) {
+    let mut data = vec![0u8; 256];
+    let mut rng = rand::thread_rng();
+    let mut subst = (0..=255u8).collect::<Vec<_>>();
+    subst.shuffle(&mut rng);
+
+    b.iter(|| {
+        data.iter_mut().enumerate().for_each(|(i, d)| {
+            *d = d.wrapping_add(i as u8) ^ subst[i];
+        });
+    });
+
+    black_box(data);
+}
+
 #[derive(Clone)]
 struct Droppable(usize);