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

optimizte reading alligned unsized strings

This commit is contained in:
Robin Appelman 2019-09-22 16:26:10 +02:00
commit 296b2e1092
3 changed files with 48 additions and 30 deletions

View file

@ -13,6 +13,7 @@ travis-ci = { repository = "icewind1991/bitstream_reader" }
[dependencies] [dependencies]
num-traits = "0.2" num-traits = "0.2"
bitstream_reader_derive = { version = "0.6", path = "bitstream_reader_derive" } bitstream_reader_derive = { version = "0.6", path = "bitstream_reader_derive" }
bytecount = "0.5"
[dev-dependencies] [dev-dependencies]
maplit = "1.0.1" maplit = "1.0.1"

View file

@ -184,7 +184,7 @@ fn perf_bytes_be(b: &mut Bencher) {
#[bench] #[bench]
fn perf_bytes_le(b: &mut Bencher) { fn perf_bytes_le(b: &mut Bencher) {
let buffer = BitBuffer::new(get_string_buffer(), BigEndian); let buffer = BitBuffer::new(get_string_buffer(), LittleEndian);
b.iter(|| { b.iter(|| {
let mut pos = 0; let mut pos = 0;
@ -205,7 +205,7 @@ fn perf_bytes_be_unaligned(b: &mut Bencher) {
let buffer = BitBuffer::new(get_string_buffer(), BigEndian); let buffer = BitBuffer::new(get_string_buffer(), BigEndian);
b.iter(|| { b.iter(|| {
let mut pos = 0; let mut pos = 3;
let len = buffer.bit_len(); let len = buffer.bit_len();
loop { loop {
if pos + (128 * 8) > len { if pos + (128 * 8) > len {
@ -220,7 +220,7 @@ fn perf_bytes_be_unaligned(b: &mut Bencher) {
#[bench] #[bench]
fn perf_bytes_le_unaligned(b: &mut Bencher) { fn perf_bytes_le_unaligned(b: &mut Bencher) {
let buffer = BitBuffer::new(get_string_buffer(), BigEndian); let buffer = BitBuffer::new(get_string_buffer(), LittleEndian);
b.iter(|| { b.iter(|| {
let mut pos = 3; let mut pos = 3;

View file

@ -435,7 +435,23 @@ where
} }
} }
#[inline]
fn find_null_byte(&self, byte_index: usize) -> usize {
self.bytes
.iter()
.enumerate()
.skip(byte_index)
.find(|(_, byte)| **byte == 0)
.map(|(i, _)| i)
.unwrap_or(self.byte_len())
}
#[inline]
fn read_string_bytes(&self, position: usize) -> Result<Vec<u8>> { fn read_string_bytes(&self, position: usize) -> Result<Vec<u8>> {
if false && position & 7 == 0 {
let byte_index = position / 8;
Ok(self.bytes[byte_index..self.find_null_byte(byte_index)].to_vec())
} else {
let mut acc = Vec::with_capacity(32); let mut acc = Vec::with_capacity(32);
let mut pos = position; let mut pos = position;
loop { loop {
@ -470,6 +486,7 @@ where
pos += read; pos += read;
} }
} }
}
/// Read a sequence of bits from the buffer as float /// Read a sequence of bits from the buffer as float
/// ///