Unpeel the first iteration of the loop in impl_read_unsigned_leb128.
This commit is contained in:
parent
5f549d9b49
commit
facba24926
1 changed files with 11 additions and 2 deletions
|
@ -54,8 +54,17 @@ macro_rules! impl_read_unsigned_leb128 {
|
||||||
($fn_name:ident, $int_ty:ty) => {
|
($fn_name:ident, $int_ty:ty) => {
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn $fn_name(slice: &[u8], position: &mut usize) -> $int_ty {
|
pub fn $fn_name(slice: &[u8], position: &mut usize) -> $int_ty {
|
||||||
let mut result = 0;
|
// The first iteration of this loop is unpeeled. This is a
|
||||||
let mut shift = 0;
|
// performance win because this code is hot and integer values less
|
||||||
|
// than 128 are very common, typically occurring 50-80% or more of
|
||||||
|
// the time, even for u64 and u128.
|
||||||
|
let byte = slice[*position];
|
||||||
|
*position += 1;
|
||||||
|
if (byte & 0x80) == 0 {
|
||||||
|
return byte as $int_ty;
|
||||||
|
}
|
||||||
|
let mut result = (byte & 0x7F) as $int_ty;
|
||||||
|
let mut shift = 7;
|
||||||
loop {
|
loop {
|
||||||
let byte = slice[*position];
|
let byte = slice[*position];
|
||||||
*position += 1;
|
*position += 1;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue