about summary refs log tree commit diff
diff options
context:
space:
mode:
authorThe8472 <git@infinite-source.de>2020-12-02 22:15:53 +0100
committerThe8472 <git@infinite-source.de>2021-03-21 20:54:05 +0100
commita1a04e08428f2e2e26fd88c40141f7465f708c4e (patch)
treedc0a07b206a637fdafed35e2c2aca8afdfb25cb1
parentf82664191d0e8764b7435b9d72eb0e366b8b1464 (diff)
downloadrust-a1a04e08428f2e2e26fd88c40141f7465f708c4e.tar.gz
rust-a1a04e08428f2e2e26fd88c40141f7465f708c4e.zip
add transmute-via-iterators bench
-rw-r--r--library/alloc/benches/vec.rs16
1 files changed, 16 insertions, 0 deletions
diff --git a/library/alloc/benches/vec.rs b/library/alloc/benches/vec.rs
index 73eb353f6e7..7a098219ce4 100644
--- a/library/alloc/benches/vec.rs
+++ b/library/alloc/benches/vec.rs
@@ -548,6 +548,22 @@ fn bench_in_place_zip_iter_mut(b: &mut Bencher) {
     black_box(data);
 }
 
+pub fn vec_cast<T, U>(input: Vec<T>) -> Vec<U> {
+    input.into_iter().map(|e| unsafe { std::mem::transmute_copy(&e) }).collect()
+}
+
+#[bench]
+fn bench_transmute(b: &mut Bencher) {
+    let mut vec = vec![10u32; 100];
+    b.bytes = 800; // 2 casts x 4 bytes x 100
+    b.iter(|| {
+        let v = std::mem::take(&mut vec);
+        let v = black_box(vec_cast::<u32, i32>(v));
+        let v = black_box(vec_cast::<i32, u32>(v));
+        vec = v;
+    });
+}
+
 #[derive(Clone)]
 struct Droppable(usize);