Skip to content

Instantly share code, notes, and snippets.

@hsqStephenZhang
Created February 20, 2026 15:51
Show Gist options
  • Select an option

  • Save hsqStephenZhang/4aa9ab90a1c22407d888bf3f4a6f75a4 to your computer and use it in GitHub Desktop.

Select an option

Save hsqStephenZhang/4aa9ab90a1c22407d888bf3f4a6f75a4 to your computer and use it in GitHub Desktop.
benchmark between sonic-rs and atoi_simd
// Benchmark comparison between atoi_simd and sonic-number
use std::hint::black_box;
use atoi_simd::parse as atoi_simd_parse;
use criterion::{Criterion, criterion_group, criterion_main};
use sonic_number::simd_str2int;
const NUMBERS: &[&str] = &[
"1234567890123",
"12345678901234",
"123456789012345",
"1234567890123456", // max 16 digits for `simd_str2int`
];
#[inline(always)]
pub unsafe fn str2int(c: &[u8], need: usize) -> (u64, usize) {
debug_assert!(need < 17);
let mut sum = 0u64;
let mut i = 0;
while i < need && c.get_unchecked(i).is_ascii_digit() {
sum = (c.get_unchecked(i) - b'0') as u64 + sum * 10;
i += 1;
}
(sum, i)
}
fn bench_i64(c: &mut Criterion) {
let expected = NUMBERS
.iter()
.map(|s| s.parse::<u64>().unwrap())
.collect::<Vec<_>>();
c.bench_function("std number parse", |b| {
b.iter(|| {
for (s, expected) in black_box(NUMBERS).iter().zip(expected.iter()) {
let val = s.parse::<u64>().unwrap();
assert_eq!(val, *expected);
}
})
});
c.bench_function("fallback number parse", |b| {
b.iter(|| {
for (s, expected) in NUMBERS.iter().zip(expected.iter()) {
let val = unsafe { str2int(black_box(s.as_bytes()), s.len()) };
assert_eq!(val.0, *expected);
}
})
});
c.bench_function("sonic-number parse", |b| {
b.iter(|| {
for (s, expected) in NUMBERS.iter().zip(expected.iter()) {
let val = unsafe { simd_str2int(black_box(s.as_bytes()), s.len()) };
assert_eq!(val.0, *expected);
}
})
});
c.bench_function("atoi_simd parse", |b| {
b.iter(|| {
for (s, expected) in NUMBERS.iter().zip(expected.iter()) {
let val = atoi_simd_parse::<u64, false, false>(black_box(s.as_bytes())).unwrap();
assert_eq!(val, *expected);
}
})
});
}
criterion_group!(benches, bench_i64);
criterion_main!(benches);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment