Created
February 20, 2026 15:51
-
-
Save hsqStephenZhang/4aa9ab90a1c22407d888bf3f4a6f75a4 to your computer and use it in GitHub Desktop.
benchmark between sonic-rs and atoi_simd
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // 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