Skip to content

Commit 73ab635

Browse files
committed
Further unrelated optimizations of the fast path
1 parent 10f801a commit 73ab635

File tree

1 file changed

+42
-28
lines changed

1 file changed

+42
-28
lines changed

src/number.rs

Lines changed: 42 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -174,40 +174,54 @@ pub fn parse_number(s: &[u8], fmt: FloatFormat) -> Option<(Number, usize)> {
174174
}
175175
}
176176

177+
let len = s.offset_from(&start) as _;
178+
177179
// handle uncommon case with many digits
178-
let mut many_digits = false;
179180
n_digits -= 19;
181+
if n_digits <= 0 {
182+
return Some((
183+
Number {
184+
exponent,
185+
mantissa,
186+
negative,
187+
many_digits: false,
188+
},
189+
len,
190+
));
191+
}
192+
193+
let mut many_digits = false;
194+
let mut p = digits_start;
195+
while p.check_first_either(b'0', b'.') {
196+
n_digits -= p.first().saturating_sub(b'0' - 1) as isize; // '0' = b'.' + 2
197+
p.step();
198+
}
180199
if n_digits > 0 {
181-
let mut p = digits_start;
182-
while p.check_first_either(b'0', b'.') {
183-
n_digits -= p.first().saturating_sub(b'0' - 1) as isize; // '0' = b'.' + 2
184-
p.step();
185-
}
186-
if n_digits > 0 {
187-
// at this point we have more than 19 significant digits, let's try again
188-
many_digits = true;
189-
mantissa = 0u64;
190-
let mut s = digits_start;
200+
// at this point we have more than 19 significant digits, let's try again
201+
many_digits = true;
202+
mantissa = 0u64;
203+
let mut s = digits_start;
204+
try_parse_19digits(&mut s, &mut mantissa);
205+
exponent = if mantissa >= MIN_19DIGIT_INT {
206+
int_end.offset_from(&s) // big int
207+
} else {
208+
s.step(); // fractional component, skip the '.'
209+
let before = s;
191210
try_parse_19digits(&mut s, &mut mantissa);
192-
exponent = if mantissa >= MIN_19DIGIT_INT {
193-
int_end.offset_from(&s) // big int
194-
} else {
195-
s.step(); // fractional component, skip the '.'
196-
let before = s;
197-
try_parse_19digits(&mut s, &mut mantissa);
198-
-s.offset_from(&before)
199-
} as i64;
200-
exponent += exp_number; // add back the explicit part
201-
}
211+
-s.offset_from(&before)
212+
} as i64;
213+
exponent += exp_number; // add back the explicit part
202214
}
203215

204-
let number = Number {
205-
exponent,
206-
mantissa,
207-
negative,
208-
many_digits,
209-
};
210-
Some((number, s.offset_from(&start) as usize))
216+
Some((
217+
Number {
218+
exponent,
219+
mantissa,
220+
negative,
221+
many_digits,
222+
},
223+
len,
224+
))
211225
}
212226

213227
#[inline]

0 commit comments

Comments
 (0)