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:
parent
613199c089
commit
76bd8f6bb1
2 changed files with 28 additions and 8 deletions
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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 shifted = byte >> bit_offset;
|
||||||
let byte = unsafe { self.bytes.get_unchecked(byte_index) };
|
shifted & 1u8 == 1
|
||||||
let shifted = byte >> bit_offset;
|
})
|
||||||
Ok(shifted & 1u8 == 1)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Read a sequence of bits from the buffer as integer
|
/// Read a sequence of bits from the buffer as integer
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue