Skip to content

Instantly share code, notes, and snippets.

@erickt
Created July 7, 2014 05:59
Show Gist options
  • Save erickt/7a3fd8689159e69ed74c to your computer and use it in GitHub Desktop.
Save erickt/7a3fd8689159e69ed74c to your computer and use it in GitHub Desktop.
extern crate test;
use test::Bencher;
use std::ptr;
static LEN: uint = 100;
#[inline(never)]
fn do_push_all<T: Clone>(dst: &mut Vec<T>, src: &[T]) {
dst.push_all(src);
}
#[inline(never)]
fn do_extend<T: Clone>(dst: &mut Vec<T>, src: &[T]) {
dst.extend(src.iter().map(|x| x.clone()));
}
#[inline(never)]
fn do_unsafe_copy(dst: &mut Vec<u8>, src: &[u8]) {
unsafe {
let dst_len = dst.len();
let src_len = src.len();
dst.set_len(dst_len + src_len);
ptr::copy_nonoverlapping_memory(
dst.as_mut_ptr().offset(dst_len as int),
src.as_ptr(),
src_len);
}
}
#[inline(never)]
fn do_clone_hack(dst: &mut Vec<u8>, src: &[u8]) {
let mut dst_len = dst.len();
let src_len = src.len();
for i in range(0, src_len) {
unsafe {
let x = src.unsafe_ref(i).clone();
ptr::write(
dst.as_mut_slice().unsafe_mut_ref(dst_len),
x);
dst_len += 1;
//dst.set_len(dst_len + 1);
}
}
unsafe {
dst.set_len(dst_len);
}
}
#[inline(never)]
fn do_clone_hack_internal_iter1(dst: &mut Vec<u8>, src: &[u8]) {
for x in src.iter() {
let dst_len = dst.len();
let x = x.clone();
unsafe {
ptr::write(
dst.as_mut_slice().unsafe_mut_ref(dst_len),
x);
dst.set_len(dst_len + 1);
}
}
}
#[inline(never)]
fn do_clone_hack_internal_iter2(dst: &mut Vec<u8>, src: &[u8]) {
let mut dst_len = dst.len();
for x in src.iter() {
let x = x.clone();
unsafe {
ptr::write(
dst.as_mut_slice().unsafe_mut_ref(dst_len),
x);
dst_len += 1;
}
}
unsafe {
dst.set_len(dst_len);
}
}
//#[inline(never)]
fn do_clone_hack_external_iter1<'a, Iter: Iterator<&'a u8>>(dst: &mut Vec<u8>, mut src: Iter) {
for x in src {
let dst_len = dst.len();
let x = x.clone();
unsafe {
ptr::write(
dst.as_mut_slice().unsafe_mut_ref(dst_len),
x);
dst.set_len(dst_len + 1);
}
}
}
//#[inline(never)]
fn do_clone_hack_external_iter2<'a, Iter: Iterator<&'a u8>>(dst: &mut Vec<u8>, mut src: Iter) {
let mut dst_len = dst.len();
for x in src {
let x = x.clone();
unsafe {
ptr::write(
dst.as_mut_slice().unsafe_mut_ref(dst_len),
x);
dst_len += 1;
}
}
unsafe {
dst.set_len(dst_len);
}
}
fn check_zeros(v: &[u8]) {
assert_eq!(v.len(), LEN * LEN);
for x in v.iter() {
assert_eq!(*x, 0);
}
}
#[bench]
fn bench_push_all(b: &mut Bencher) {
b.bytes = LEN as u64 * LEN as u64;
b.iter(|| {
let mut dst = Vec::new();
let src = [0u8, .. LEN];
for _ in range(0, LEN) {
dst.reserve_additional(src.len());
do_push_all(&mut dst, src);
}
check_zeros(dst.as_slice());
});
}
#[bench]
fn bench_extend(b: &mut Bencher) {
b.bytes = LEN as u64 * LEN as u64;
b.iter(|| {
let mut dst = Vec::new();
let src = [0u8, .. LEN];
for _ in range(0, LEN) {
dst.reserve_additional(src.len());
do_extend(&mut dst, src);
}
check_zeros(dst.as_slice());
});
}
#[bench]
fn bench_unsafe_copy(b: &mut Bencher) {
b.bytes = LEN as u64 * LEN as u64;
b.iter(|| {
let mut dst = Vec::new();
let src = [0u8, .. LEN];
for _ in range(0, LEN) {
dst.reserve_additional(src.len());
do_unsafe_copy(&mut dst, src);
}
check_zeros(dst.as_slice());
});
}
#[bench]
fn bench_clone_hack(b: &mut Bencher) {
b.bytes = LEN as u64 * LEN as u64;
b.iter(|| {
let mut dst = Vec::new();
let src = [0u8, .. LEN];
for _ in range(0, LEN) {
dst.reserve_additional(src.len());
do_clone_hack(&mut dst, src);
}
check_zeros(dst.as_slice());
});
}
#[bench]
fn bench_clone_hack_internal_iter1(b: &mut Bencher) {
b.bytes = LEN as u64 * LEN as u64;
b.iter(|| {
let mut dst = Vec::new();
let src = [0u8, .. LEN];
for _ in range(0, LEN) {
dst.reserve_additional(src.len());
do_clone_hack_internal_iter1(&mut dst, src);
}
check_zeros(dst.as_slice());
});
}
#[bench]
fn bench_clone_hack_internal_iter2(b: &mut Bencher) {
b.bytes = LEN as u64 * LEN as u64;
b.iter(|| {
let mut dst = Vec::new();
let src = [0u8, .. LEN];
for _ in range(0, LEN) {
dst.reserve_additional(src.len());
do_clone_hack_internal_iter2(&mut dst, src);
}
check_zeros(dst.as_slice());
});
}
#[bench]
fn bench_clone_hack_external_iter1(b: &mut Bencher) {
b.bytes = LEN as u64 * LEN as u64;
b.iter(|| {
let mut dst = Vec::new();
let src = [0u8, .. LEN];
for _ in range(0, LEN) {
dst.reserve_additional(src.len());
do_clone_hack_external_iter1(&mut dst, src.iter());
}
check_zeros(dst.as_slice());
});
}
#[bench]
fn bench_clone_hack_external_iter2(b: &mut Bencher) {
b.bytes = LEN as u64 * LEN as u64;
b.iter(|| {
let mut dst = Vec::new();
let src = [0u8, .. LEN];
for _ in range(0, LEN) {
dst.reserve_additional(src.len());
do_clone_hack_external_iter2(&mut dst, src.iter());
}
check_zeros(dst.as_slice());
});
}
/*
fn main() {
let mut dst = Vec::new();
let src = [0u8, .. LEN];
for _ in range(0, LEN) {
dst.reserve_additional(src.len());
do_clone_hack(&mut dst, src);
}
}
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment