Closed
Description
In the process of implementing #28481 for BinaryHeap
, I noticed that Vec::clone_from
is often slower than Vec::clone
:
#![cfg_attr(test, feature(test))]
#[cfg(test)]
extern crate test;
macro_rules! bench {
($name:ident, $src_len:expr, $dst_len:expr) => {
mod $name {
#[bench]
fn clone_from(b: &mut ::test::Bencher) {
let src: Vec<i32> = (0..$src_len).collect();
let mut dst: Vec<i32> = (0..$dst_len).collect();
b.iter(|| {
dst.clone_from(&src);
unsafe { dst.set_len($dst_len as usize); }
::test::black_box(&mut dst);
});
}
#[bench]
fn clone(b: &mut ::test::Bencher) {
let src: Vec<i32> = (0..$src_len).collect();
let mut dst: Vec<i32> = (0..$dst_len).collect();
b.iter(|| {
dst = src.clone();
unsafe { dst.set_len($dst_len as usize); }
::test::black_box(&mut dst);
});
}
}
}
}
mod eq {
bench! { src_100_dst_100, 100, 100 }
bench! { src_1000_dst_1000, 1000, 1000 }
}
mod src_bigger {
bench! { src_100_dst_10, 100, 10 }
bench! { src_1000_dst_100, 1000, 100 }
}
mod dst_bigger {
bench! { src_10_dst_100, 10, 100 }
bench! { src_100_dst_1000, 100, 1000 }
}
Output with rustc 1.5.0-nightly (b2f379cdc 2015-09-23)
:
test dst_bigger::src_100_dst_1000::clone ... bench: 34 ns/iter (+/- 1)
test dst_bigger::src_100_dst_1000::clone_from ... bench: 75 ns/iter (+/- 3)
test dst_bigger::src_10_dst_100::clone ... bench: 25 ns/iter (+/- 0)
test dst_bigger::src_10_dst_100::clone_from ... bench: 9 ns/iter (+/- 1)
test eq::src_1000_dst_1000::clone ... bench: 105 ns/iter (+/- 2)
test eq::src_1000_dst_1000::clone_from ... bench: 593 ns/iter (+/- 21)
test eq::src_100_dst_100::clone ... bench: 34 ns/iter (+/- 1)
test eq::src_100_dst_100::clone_from ... bench: 75 ns/iter (+/- 1)
test src_bigger::src_1000_dst_100::clone ... bench: 103 ns/iter (+/- 5)
test src_bigger::src_1000_dst_100::clone_from ... bench: 148 ns/iter (+/- 5)
test src_bigger::src_100_dst_10::clone ... bench: 34 ns/iter (+/- 1)
test src_bigger::src_100_dst_10::clone_from ... bench: 20 ns/iter (+/- 0)
These benchmarks are probably naive (and different sizes may have a more meaningful effect), but it seems to warrant investigation.
Metadata
Metadata
Assignees
Labels
No labels