154 lines
3.5 KiB
Rust
154 lines
3.5 KiB
Rust
/*! Macro construction benchmarks.
|
|
|
|
This is taken from [issue #28], which noted that the `bitvec![bit; rep]`
|
|
expansion was horribly inefficient.
|
|
|
|
This benchmark crate should be used for all macro performance recording, and
|
|
compare the macros against `vec!`. While `vec!` will always be faster, because
|
|
`bitvec!` does more work than `vec!`, they should at least be close.
|
|
|
|
Original performance was 10,000x slower. Performance after the fix for #28 was
|
|
within 20ns.
|
|
|
|
[issue #28]: https://github.com/myrrlyn/bitvec/issues/28
|
|
!*/
|
|
|
|
#![feature(test)]
|
|
|
|
extern crate test;
|
|
|
|
use bitvec::prelude::*;
|
|
use test::Bencher;
|
|
|
|
#[bench]
|
|
fn bits_seq_u8(b: &mut Bencher) {
|
|
b.iter(|| {
|
|
bitarr![u8, LocalBits;
|
|
0, 1, 0, 1, 0, 0, 1, 1,
|
|
0, 1, 1, 0, 0, 0, 0, 1,
|
|
0, 1, 1, 0, 1, 1, 0, 0,
|
|
0, 1, 1, 1, 0, 1, 0, 1,
|
|
0, 1, 1, 1, 0, 1, 0, 0,
|
|
0, 1, 1, 0, 1, 1, 1, 1,
|
|
0, 1, 1, 0, 1, 1, 1, 0,
|
|
0, 0, 1, 0, 1, 1, 0, 0,
|
|
0, 0, 1, 0, 0, 0, 0, 0,
|
|
0, 1, 1, 0, 1, 1, 0, 1,
|
|
0, 1, 1, 0, 1, 1, 1, 1,
|
|
0, 1, 1, 0, 1, 1, 1, 0,
|
|
0, 1, 1, 0, 0, 1, 0, 0,
|
|
0, 1, 1, 0, 1, 1, 1, 1,
|
|
0, 0, 1, 0, 0, 0, 0, 1,
|
|
]
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn bits_seq_u16(b: &mut Bencher) {
|
|
b.iter(|| {
|
|
bitarr![u16, LocalBits;
|
|
0, 1, 0, 1, 0, 0, 1, 1,
|
|
0, 1, 1, 0, 0, 0, 0, 1,
|
|
0, 1, 1, 0, 1, 1, 0, 0,
|
|
0, 1, 1, 1, 0, 1, 0, 1,
|
|
0, 1, 1, 1, 0, 1, 0, 0,
|
|
0, 1, 1, 0, 1, 1, 1, 1,
|
|
0, 1, 1, 0, 1, 1, 1, 0,
|
|
0, 0, 1, 0, 1, 1, 0, 0,
|
|
0, 0, 1, 0, 0, 0, 0, 0,
|
|
0, 1, 1, 0, 1, 1, 0, 1,
|
|
0, 1, 1, 0, 1, 1, 1, 1,
|
|
0, 1, 1, 0, 1, 1, 1, 0,
|
|
0, 1, 1, 0, 0, 1, 0, 0,
|
|
0, 1, 1, 0, 1, 1, 1, 1,
|
|
0, 0, 1, 0, 0, 0, 0, 1,
|
|
]
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn bits_seq_u32(b: &mut Bencher) {
|
|
b.iter(|| {
|
|
bitarr![u32, LocalBits;
|
|
0, 1, 0, 1, 0, 0, 1, 1,
|
|
0, 1, 1, 0, 0, 0, 0, 1,
|
|
0, 1, 1, 0, 1, 1, 0, 0,
|
|
0, 1, 1, 1, 0, 1, 0, 1,
|
|
0, 1, 1, 1, 0, 1, 0, 0,
|
|
0, 1, 1, 0, 1, 1, 1, 1,
|
|
0, 1, 1, 0, 1, 1, 1, 0,
|
|
0, 0, 1, 0, 1, 1, 0, 0,
|
|
0, 0, 1, 0, 0, 0, 0, 0,
|
|
0, 1, 1, 0, 1, 1, 0, 1,
|
|
0, 1, 1, 0, 1, 1, 1, 1,
|
|
0, 1, 1, 0, 1, 1, 1, 0,
|
|
0, 1, 1, 0, 0, 1, 0, 0,
|
|
0, 1, 1, 0, 1, 1, 1, 1,
|
|
0, 0, 1, 0, 0, 0, 0, 1,
|
|
]
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
#[cfg(target_pointer_width = "64")]
|
|
fn bits_seq_u64(b: &mut Bencher) {
|
|
b.iter(|| {
|
|
bitarr![u64, LocalBits;
|
|
0, 1, 0, 1, 0, 0, 1, 1,
|
|
0, 1, 1, 0, 0, 0, 0, 1,
|
|
0, 1, 1, 0, 1, 1, 0, 0,
|
|
0, 1, 1, 1, 0, 1, 0, 1,
|
|
0, 1, 1, 1, 0, 1, 0, 0,
|
|
0, 1, 1, 0, 1, 1, 1, 1,
|
|
0, 1, 1, 0, 1, 1, 1, 0,
|
|
0, 0, 1, 0, 1, 1, 0, 0,
|
|
0, 0, 1, 0, 0, 0, 0, 0,
|
|
0, 1, 1, 0, 1, 1, 0, 1,
|
|
0, 1, 1, 0, 1, 1, 1, 1,
|
|
0, 1, 1, 0, 1, 1, 1, 0,
|
|
0, 1, 1, 0, 0, 1, 0, 0,
|
|
0, 1, 1, 0, 1, 1, 1, 1,
|
|
0, 0, 1, 0, 0, 0, 0, 1,
|
|
]
|
|
});
|
|
}
|
|
|
|
// The repetition macros run at compile time, so should bench at zero.
|
|
|
|
#[bench]
|
|
fn bits_rep_u8(b: &mut Bencher) {
|
|
b.iter(|| bitarr![u8, LocalBits; 0; 120]);
|
|
b.iter(|| bitarr![u8, LocalBits; 1; 120]);
|
|
}
|
|
|
|
#[bench]
|
|
fn bits_rep_u16(b: &mut Bencher) {
|
|
b.iter(|| bitarr![u16, LocalBits; 0; 120]);
|
|
b.iter(|| bitarr![u16, LocalBits; 1; 120]);
|
|
}
|
|
|
|
#[bench]
|
|
fn bits_rep_u32(b: &mut Bencher) {
|
|
b.iter(|| bitarr![u32, LocalBits; 0; 120]);
|
|
b.iter(|| bitarr![u32, LocalBits; 1; 120]);
|
|
}
|
|
|
|
#[bench]
|
|
#[cfg(target_pointer_width = "64")]
|
|
fn bits_rep_u64(b: &mut Bencher) {
|
|
b.iter(|| bitarr![u64, LocalBits; 0; 120]);
|
|
b.iter(|| bitarr![u64, LocalBits; 1; 120]);
|
|
}
|
|
|
|
#[bench]
|
|
fn bitvec_rep(b: &mut Bencher) {
|
|
b.iter(|| bitvec![0; 16 * 16 * 9]);
|
|
b.iter(|| bitvec![1; 16 * 16 * 9]);
|
|
}
|
|
|
|
#[bench]
|
|
fn vec_rep(b: &mut Bencher) {
|
|
b.iter(|| vec![0u8; 16 * 16 * 9 / 8]);
|
|
b.iter(|| vec![-1i8; 16 * 16 * 9 / 8]);
|
|
}
|