1
0
Fork 0
mirror of https://codeberg.org/icewind/bitbuffer.git synced 2026-06-03 16:44:06 +02:00

remove usafe code from read_bool

safe version is a bit faster than the unsafe version even
This commit is contained in:
Robin Appelman 2019-07-24 12:24:15 +02:00
commit 76bd8f6bb1
2 changed files with 28 additions and 8 deletions

View file

@ -19,6 +19,7 @@ fn read_perf<E: Endianness>(buffer: &BitBuffer<E>) -> u16 {
pos += size; pos += size;
} }
} }
#[bench] #[bench]
fn perf_le(b: &mut Bencher) { fn perf_le(b: &mut Bencher) {
let data = vec![1u8; 1024 * 1024 * 10]; let data = vec![1u8; 1024 * 1024 * 10];
@ -85,6 +86,24 @@ fn perf_f64(b: &mut Bencher) {
}); });
} }
#[bench]
fn perf_bool(b: &mut Bencher) {
let data = vec![1u8; 1024 * 1024 * 1];
let buffer = BitBuffer::new(data, BigEndian);
b.iter(|| {
let mut pos = 0;
let len = buffer.bit_len();
loop {
if pos >= len {
break;
}
let num = buffer.read_bool(pos).unwrap();
test::black_box(num);
pos += 1;
}
});
}
fn build_string_data(size: usize, inputs: &Vec<&str>) -> Vec<u8> { fn build_string_data(size: usize, inputs: &Vec<&str>) -> Vec<u8> {
let mut data = Vec::with_capacity(size); let mut data = Vec::with_capacity(size);
loop { loop {
@ -97,6 +116,7 @@ fn build_string_data(size: usize, inputs: &Vec<&str>) -> Vec<u8> {
} }
} }
} }
fn verify_buffer(buffer: &BitBuffer<BigEndian>, inputs: &Vec<&str>) { fn verify_buffer(buffer: &BitBuffer<BigEndian>, inputs: &Vec<&str>) {
let mut pos = 0; let mut pos = 0;
let len = buffer.bit_len(); let len = buffer.bit_len();

View file

@ -148,16 +148,16 @@ where
let byte_index = position / 8; let byte_index = position / 8;
let bit_offset = position & 7; let bit_offset = position & 7;
if position >= self.bit_len { self.bytes
return Err(ReadError::NotEnoughData { .get(byte_index)
.ok_or_else(|| ReadError::NotEnoughData {
requested: 1, requested: 1,
bits_left: self.bit_len - position, bits_left: self.bit_len - position,
}); })
} .map(|byte| {
let byte = unsafe { self.bytes.get_unchecked(byte_index) };
let shifted = byte >> bit_offset; let shifted = byte >> bit_offset;
Ok(shifted & 1u8 == 1) shifted & 1u8 == 1
})
} }
/// Read a sequence of bits from the buffer as integer /// Read a sequence of bits from the buffer as integer