#! [feature(test)]
extern crate test;
macro_rules! bench_num {
($name:ident, $read:ident, $bytes:expr, $data:expr) => {
mod $name {
use byteorder::{
BigEndian, ByteOrder, LittleEndian, NativeEndian,
};
use test::black_box as bb;
use test::Bencher;
const NITER: usize = 100 _000 ;
#[ bench]
fn read_big_endian(b: &mut Bencher) {
let buf = $data;
b.iter(|| {
for _ in 0 ..NITER {
bb(BigEndian::$read(&buf, $bytes));
}
});
}
#[ bench]
fn read_little_endian(b: &mut Bencher) {
let buf = $data;
b.iter(|| {
for _ in 0 ..NITER {
bb(LittleEndian::$read(&buf, $bytes));
}
});
}
#[ bench]
fn read_native_endian(b: &mut Bencher) {
let buf = $data;
b.iter(|| {
for _ in 0 ..NITER {
bb(NativeEndian::$read(&buf, $bytes));
}
});
}
}
};
($ty:ident, $max:ident,
$read:ident, $write:ident, $size:expr, $data:expr) => {
mod $ty {
use byteorder::{
BigEndian, ByteOrder, LittleEndian, NativeEndian,
};
use std::$ty;
use test::black_box as bb;
use test::Bencher;
const NITER: usize = 100 _000 ;
#[ bench]
fn read_big_endian(b: &mut Bencher) {
let buf = $data;
b.iter(|| {
for _ in 0 ..NITER {
bb(BigEndian::$read(&buf));
}
});
}
#[ bench]
fn read_little_endian(b: &mut Bencher) {
let buf = $data;
b.iter(|| {
for _ in 0 ..NITER {
bb(LittleEndian::$read(&buf));
}
});
}
#[ bench]
fn read_native_endian(b: &mut Bencher) {
let buf = $data;
b.iter(|| {
for _ in 0 ..NITER {
bb(NativeEndian::$read(&buf));
}
});
}
#[ bench]
fn write_big_endian(b: &mut Bencher) {
let mut buf = $data;
let n = $ty::$max;
b.iter(|| {
for _ in 0 ..NITER {
bb(BigEndian::$write(&mut buf, n));
}
});
}
#[ bench]
fn write_little_endian(b: &mut Bencher) {
let mut buf = $data;
let n = $ty::$max;
b.iter(|| {
for _ in 0 ..NITER {
bb(LittleEndian::$write(&mut buf, n));
}
});
}
#[ bench]
fn write_native_endian(b: &mut Bencher) {
let mut buf = $data;
let n = $ty::$max;
b.iter(|| {
for _ in 0 ..NITER {
bb(NativeEndian::$write(&mut buf, n));
}
});
}
}
};
}
bench_num!(u16, MAX, read_u16, write_u16, 2 , [1 , 2 ]);
bench_num!(i16, MAX, read_i16, write_i16, 2 , [1 , 2 ]);
bench_num!(u32, MAX, read_u32, write_u32, 4 , [1 , 2 , 3 , 4 ]);
bench_num!(i32, MAX, read_i32, write_i32, 4 , [1 , 2 , 3 , 4 ]);
bench_num!(u64, MAX, read_u64, write_u64, 8 , [1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ]);
bench_num!(i64, MAX, read_i64, write_i64, 8 , [1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ]);
bench_num!(f32, MAX, read_f32, write_f32, 4 , [1 , 2 , 3 , 4 ]);
bench_num!(f64, MAX, read_f64, write_f64, 8 , [1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ]);
bench_num!(uint_1, read_uint, 1 , [1 ]);
bench_num!(uint_2, read_uint, 2 , [1 , 2 ]);
bench_num!(uint_3, read_uint, 3 , [1 , 2 , 3 ]);
bench_num!(uint_4, read_uint, 4 , [1 , 2 , 3 , 4 ]);
bench_num!(uint_5, read_uint, 5 , [1 , 2 , 3 , 4 , 5 ]);
bench_num!(uint_6, read_uint, 6 , [1 , 2 , 3 , 4 , 5 , 6 ]);
bench_num!(uint_7, read_uint, 7 , [1 , 2 , 3 , 4 , 5 , 6 , 7 ]);
bench_num!(uint_8, read_uint, 8 , [1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ]);
bench_num!(int_1, read_int, 1 , [1 ]);
bench_num!(int_2, read_int, 2 , [1 , 2 ]);
bench_num!(int_3, read_int, 3 , [1 , 2 , 3 ]);
bench_num!(int_4, read_int, 4 , [1 , 2 , 3 , 4 ]);
bench_num!(int_5, read_int, 5 , [1 , 2 , 3 , 4 , 5 ]);
bench_num!(int_6, read_int, 6 , [1 , 2 , 3 , 4 , 5 , 6 ]);
bench_num!(int_7, read_int, 7 , [1 , 2 , 3 , 4 , 5 , 6 , 7 ]);
bench_num!(int_8, read_int, 8 , [1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ]);
bench_num!(
u128,
MAX,
read_u128,
write_u128,
16 ,
[1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 ]
);
bench_num!(
i128,
MAX,
read_i128,
write_i128,
16 ,
[1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 ]
);
bench_num!(uint128_1, read_uint128, 1 , [1 ]);
bench_num!(uint128_2, read_uint128, 2 , [1 , 2 ]);
bench_num!(uint128_3, read_uint128, 3 , [1 , 2 , 3 ]);
bench_num!(uint128_4, read_uint128, 4 , [1 , 2 , 3 , 4 ]);
bench_num!(uint128_5, read_uint128, 5 , [1 , 2 , 3 , 4 , 5 ]);
bench_num!(uint128_6, read_uint128, 6 , [1 , 2 , 3 , 4 , 5 , 6 ]);
bench_num!(uint128_7, read_uint128, 7 , [1 , 2 , 3 , 4 , 5 , 6 , 7 ]);
bench_num!(uint128_8, read_uint128, 8 , [1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ]);
bench_num!(uint128_9, read_uint128, 9 , [1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]);
bench_num!(uint128_10, read_uint128, 10 , [1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ]);
bench_num!(uint128_11, read_uint128, 11 , [1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 ]);
bench_num!(
uint128_12,
read_uint128,
12 ,
[1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 ]
);
bench_num!(
uint128_13,
read_uint128,
13 ,
[1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 ]
);
bench_num!(
uint128_14,
read_uint128,
14 ,
[1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 ]
);
bench_num!(
uint128_15,
read_uint128,
15 ,
[1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 ]
);
bench_num!(
uint128_16,
read_uint128,
16 ,
[1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 ]
);
bench_num!(int128_1, read_int128, 1 , [1 ]);
bench_num!(int128_2, read_int128, 2 , [1 , 2 ]);
bench_num!(int128_3, read_int128, 3 , [1 , 2 , 3 ]);
bench_num!(int128_4, read_int128, 4 , [1 , 2 , 3 , 4 ]);
bench_num!(int128_5, read_int128, 5 , [1 , 2 , 3 , 4 , 5 ]);
bench_num!(int128_6, read_int128, 6 , [1 , 2 , 3 , 4 , 5 , 6 ]);
bench_num!(int128_7, read_int128, 7 , [1 , 2 , 3 , 4 , 5 , 6 , 7 ]);
bench_num!(int128_8, read_int128, 8 , [1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ]);
bench_num!(int128_9, read_int128, 9 , [1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]);
bench_num!(int128_10, read_int128, 10 , [1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ]);
bench_num!(int128_11, read_int128, 11 , [1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 ]);
bench_num!(
int128_12,
read_int128,
12 ,
[1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 ]
);
bench_num!(
int128_13,
read_int128,
13 ,
[1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 ]
);
bench_num!(
int128_14,
read_int128,
14 ,
[1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 ]
);
bench_num!(
int128_15,
read_int128,
15 ,
[1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 ]
);
bench_num!(
int128_16,
read_int128,
16 ,
[1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 ]
);
macro_rules! bench_slice {
($name:ident, $numty:ty, $read:ident, $write:ident) => {
mod $name {
use std::mem::size_of;
use byteorder::{BigEndian, ByteOrder, LittleEndian};
use rand::distributions;
use rand::{self , Rng};
use test::Bencher;
#[ bench]
fn read_big_endian(b: &mut Bencher) {
let mut numbers: Vec<$numty> = rand::thread_rng()
.sample_iter(&distributions::Standard)
.take(100000 )
.collect();
let mut bytes = vec![0 ; numbers.len() * size_of::<$numty>()];
BigEndian::$write(&numbers, &mut bytes);
b.bytes = bytes.len() as u64;
b.iter(|| {
BigEndian::$read(&bytes, &mut numbers);
});
}
#[ bench]
fn read_little_endian(b: &mut Bencher) {
let mut numbers: Vec<$numty> = rand::thread_rng()
.sample_iter(&distributions::Standard)
.take(100000 )
.collect();
let mut bytes = vec![0 ; numbers.len() * size_of::<$numty>()];
LittleEndian::$write(&numbers, &mut bytes);
b.bytes = bytes.len() as u64;
b.iter(|| {
LittleEndian::$read(&bytes, &mut numbers);
});
}
#[ bench]
fn write_big_endian(b: &mut Bencher) {
let numbers: Vec<$numty> = rand::thread_rng()
.sample_iter(&distributions::Standard)
.take(100000 )
.collect();
let mut bytes = vec![0 ; numbers.len() * size_of::<$numty>()];
b.bytes = bytes.len() as u64;
b.iter(|| {
BigEndian::$write(&numbers, &mut bytes);
});
}
#[ bench]
fn write_little_endian(b: &mut Bencher) {
let numbers: Vec<$numty> = rand::thread_rng()
.sample_iter(&distributions::Standard)
.take(100000 )
.collect();
let mut bytes = vec![0 ; numbers.len() * size_of::<$numty>()];
b.bytes = bytes.len() as u64;
b.iter(|| {
LittleEndian::$write(&numbers, &mut bytes);
});
}
}
};
}
bench_slice!(slice_u16, u16, read_u16_into, write_u16_into);
bench_slice!(slice_u64, u64, read_u64_into, write_u64_into);
bench_slice!(slice_i64, i64, read_i64_into, write_i64_into);
Messung V0.5 in Prozent C=93 H=96 G=94