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:
parent
c85d4e4fa6
commit
296b2e1092
3 changed files with 48 additions and 30 deletions
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
///
|
///
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue