From 48300879cddf2c5b114493195e127dd5fe02945b Mon Sep 17 00:00:00 2001 From: HBJ Date: Thu, 30 Jul 2026 07:52:32 +0800 Subject: [PATCH] perf: speed up high-precision parsing --- bsize/src/parse.rs | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/bsize/src/parse.rs b/bsize/src/parse.rs index 78c8cc8..3933a2a 100644 --- a/bsize/src/parse.rs +++ b/bsize/src/parse.rs @@ -125,16 +125,15 @@ fn parse_size(mut src: &[u8]) -> Result { match b { b'0'..=b'9' => { saw_digit = true; - if fraction_start.is_none() { - integer = integer - .checked_mul(10) - .and_then(|v| v.checked_add(u64::from(b - b'0'))) - .ok_or(ParseError::Overflow)?; - } + integer = integer + .checked_mul(10) + .and_then(|v| v.checked_add(u64::from(b - b'0'))) + .ok_or(ParseError::Overflow)?; } b'_' => {} - b'.' if saw_digit && fraction_start.is_none() => { + b'.' if saw_digit => { fraction_start = Some(index + 1); + break; } _ => return Err(ParseError::Malformed), } @@ -156,13 +155,15 @@ fn parse_size(mut src: &[u8]) -> Result { let mut carry = 0u64; let mut rounding_digit = 0u64; for b in src[start..].iter().copied().rev() { - if b == b'_' { - continue; + match b { + b'0'..=b'9' => { + let product = u64::from(b - b'0') * multiplier + carry; + rounding_digit = product % 10; + carry = product / 10; + } + b'_' => {} + _ => return Err(ParseError::Malformed), } - - let product = u64::from(b - b'0') * multiplier + carry; - rounding_digit = product % 10; - carry = product / 10; } let fraction = carry + u64::from(rounding_digit >= 5);