diff --git a/benches/bench.rs b/benches/bench.rs index dd8a69f..bcc7de3 100644 --- a/benches/bench.rs +++ b/benches/bench.rs @@ -7,82 +7,83 @@ use test::{black_box, Bencher}; const EXAMPLE_TIMESTAMP: &str = "1585201087123789"; const EXPECTED_TIMESTAMP: u64 = 1585201087123789; -#[bench] -fn bench_str_parse(b: &mut Bencher) { - assert_eq!(str_parse(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); - b.bytes = EXAMPLE_TIMESTAMP.len() as u64; - b.iter(|| str_parse(black_box(EXAMPLE_TIMESTAMP))); -} -#[bench] -fn bench_naive_chars(b: &mut Bencher) { - assert_eq!(naive_chars(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); - b.bytes = EXAMPLE_TIMESTAMP.len() as u64; - b.iter(|| naive_chars(black_box(EXAMPLE_TIMESTAMP))); -} +// #[bench] +// fn bench_str_parse(b: &mut Bencher) { +// assert_eq!(str_parse(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); +// b.bytes = EXAMPLE_TIMESTAMP.len() as u64; +// b.iter(|| str_parse(black_box(EXAMPLE_TIMESTAMP))); +// } -#[bench] -fn bench_naive_chars_iter(b: &mut Bencher) { - assert_eq!(naive_chars_iter(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); - b.bytes = EXAMPLE_TIMESTAMP.len() as u64; - b.iter(|| naive_chars_iter(black_box(EXAMPLE_TIMESTAMP))); -} +// #[bench] +// fn bench_naive_chars(b: &mut Bencher) { +// assert_eq!(naive_chars(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); +// b.bytes = EXAMPLE_TIMESTAMP.len() as u64; +// b.iter(|| naive_chars(black_box(EXAMPLE_TIMESTAMP))); +// } -#[bench] -fn bench_naive_chars_and(b: &mut Bencher) { - assert_eq!(naive_chars_and(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); - b.bytes = EXAMPLE_TIMESTAMP.len() as u64; - b.iter(|| naive_chars_and(black_box(EXAMPLE_TIMESTAMP))); -} +// #[bench] +// fn bench_naive_chars_iter(b: &mut Bencher) { +// assert_eq!(naive_chars_iter(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); +// b.bytes = EXAMPLE_TIMESTAMP.len() as u64; +// b.iter(|| naive_chars_iter(black_box(EXAMPLE_TIMESTAMP))); +// } -#[bench] -fn bench_naive_bytes(b: &mut Bencher) { - assert_eq!(naive_bytes(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); - b.bytes = EXAMPLE_TIMESTAMP.len() as u64; - b.iter(|| naive_bytes(black_box(EXAMPLE_TIMESTAMP))); -} +// #[bench] +// fn bench_naive_chars_and(b: &mut Bencher) { +// assert_eq!(naive_chars_and(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); +// b.bytes = EXAMPLE_TIMESTAMP.len() as u64; +// b.iter(|| naive_chars_and(black_box(EXAMPLE_TIMESTAMP))); +// } -#[bench] -fn bench_naive_bytes_iter(b: &mut Bencher) { - assert_eq!(naive_bytes_iter(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); - b.bytes = EXAMPLE_TIMESTAMP.len() as u64; - b.iter(|| naive_bytes_iter(black_box(EXAMPLE_TIMESTAMP))); -} +// #[bench] +// fn bench_naive_bytes(b: &mut Bencher) { +// assert_eq!(naive_bytes(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); +// b.bytes = EXAMPLE_TIMESTAMP.len() as u64; +// b.iter(|| naive_bytes(black_box(EXAMPLE_TIMESTAMP))); +// } -#[bench] -fn bench_naive_bytes_and(b: &mut Bencher) { - assert_eq!(naive_bytes_and(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); - b.bytes = EXAMPLE_TIMESTAMP.len() as u64; - b.iter(|| naive_bytes_and(black_box(EXAMPLE_TIMESTAMP))); -} +// #[bench] +// fn bench_naive_bytes_iter(b: &mut Bencher) { +// assert_eq!(naive_bytes_iter(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); +// b.bytes = EXAMPLE_TIMESTAMP.len() as u64; +// b.iter(|| naive_bytes_iter(black_box(EXAMPLE_TIMESTAMP))); +// } -#[bench] -fn bench_naive_bytes_and_c16(b: &mut Bencher) { - assert_eq!(naive_bytes_and_c16(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); - b.bytes = EXAMPLE_TIMESTAMP.len() as u64; - b.iter(|| naive_bytes_and_c16(black_box(EXAMPLE_TIMESTAMP))); -} +// #[bench] +// fn bench_naive_bytes_and(b: &mut Bencher) { +// assert_eq!(naive_bytes_and(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); +// b.bytes = EXAMPLE_TIMESTAMP.len() as u64; +// b.iter(|| naive_bytes_and(black_box(EXAMPLE_TIMESTAMP))); +// } -#[bench] -fn bench_unrolled(b: &mut Bencher) { - assert_eq!(unrolled(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); - b.bytes = EXAMPLE_TIMESTAMP.len() as u64; - b.iter(|| unrolled(black_box(EXAMPLE_TIMESTAMP))); -} +// #[bench] +// fn bench_naive_bytes_and_c16(b: &mut Bencher) { +// assert_eq!(naive_bytes_and_c16(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); +// b.bytes = EXAMPLE_TIMESTAMP.len() as u64; +// b.iter(|| naive_bytes_and_c16(black_box(EXAMPLE_TIMESTAMP))); +// } -#[bench] -fn bench_unrolled_unsafe(b: &mut Bencher) { - assert_eq!(unrolled_unsafe(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); - b.bytes = EXAMPLE_TIMESTAMP.len() as u64; - b.iter(|| unrolled_unsafe(black_box(EXAMPLE_TIMESTAMP))); -} +// #[bench] +// fn bench_unrolled(b: &mut Bencher) { +// assert_eq!(unrolled(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); +// b.bytes = EXAMPLE_TIMESTAMP.len() as u64; +// b.iter(|| unrolled(black_box(EXAMPLE_TIMESTAMP))); +// } -#[bench] -fn bench_unrolled_safe(b: &mut Bencher) { - assert_eq!(unrolled_safe(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); - b.bytes = EXAMPLE_TIMESTAMP.len() as u64; - b.iter(|| unrolled_safe(black_box(EXAMPLE_TIMESTAMP))); -} +// #[bench] +// fn bench_unrolled_unsafe(b: &mut Bencher) { +// assert_eq!(unrolled_unsafe(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); +// b.bytes = EXAMPLE_TIMESTAMP.len() as u64; +// b.iter(|| unrolled_unsafe(black_box(EXAMPLE_TIMESTAMP))); +// } + +// #[bench] +// fn bench_unrolled_safe(b: &mut Bencher) { +// assert_eq!(unrolled_safe(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); +// b.bytes = EXAMPLE_TIMESTAMP.len() as u64; +// b.iter(|| unrolled_safe(black_box(EXAMPLE_TIMESTAMP))); +// } #[bench] fn bench_trick(b: &mut Bencher) { @@ -92,19 +93,43 @@ fn bench_trick(b: &mut Bencher) { } #[bench] -fn bench_trick_128(b: &mut Bencher) { - assert_eq!(trick_128(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); +fn bench_trick_with_checks(b: &mut Bencher) { + assert_eq!(trick_with_checks(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); b.bytes = EXAMPLE_TIMESTAMP.len() as u64; - b.iter(|| trick_128(black_box(EXAMPLE_TIMESTAMP))); + b.iter(|| trick_with_checks(black_box(EXAMPLE_TIMESTAMP))); } #[bench] -fn bench_trick_simd(b: &mut Bencher) { - assert_eq!(trick_simd(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); +fn bench_trick_with_checks_small_u64(b: &mut Bencher) { + assert_eq!(parse_u64(":1234"), Err(())); + assert_eq!(parse_u64("12345"), Ok(12345u64)); + assert_eq!(parse_u64("1234/"), Err(())); + assert_eq!(trick_with_checks("1234"), 1234u64); + b.bytes = "1234".len() as u64; + b.iter(|| trick_with_checks(black_box("1234"))); +} + +#[bench] +fn bench_trick_with_checks_i64(b: &mut Bencher) { + assert_eq!(trick_with_checks_i64(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP as i64); b.bytes = EXAMPLE_TIMESTAMP.len() as u64; - b.iter(|| trick_simd(black_box(EXAMPLE_TIMESTAMP))); + b.iter(|| trick_with_checks_i64(black_box(EXAMPLE_TIMESTAMP))); } +// #[bench] +// fn bench_trick_128(b: &mut Bencher) { +// assert_eq!(trick_128(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); +// b.bytes = EXAMPLE_TIMESTAMP.len() as u64; +// b.iter(|| trick_128(black_box(EXAMPLE_TIMESTAMP))); +// } + +// #[bench] +// fn bench_trick_simd(b: &mut Bencher) { +// assert_eq!(trick_simd(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); +// b.bytes = EXAMPLE_TIMESTAMP.len() as u64; +// b.iter(|| trick_simd(black_box(EXAMPLE_TIMESTAMP))); +// } + // #[bench] // fn bench_trick_simd_8(b: &mut Bencher) { // assert_eq!(trick_simd_8(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); @@ -112,9 +137,9 @@ fn bench_trick_simd(b: &mut Bencher) { // b.iter(|| trick_simd_8(black_box(EXAMPLE_TIMESTAMP))); // } -#[bench] -fn bench_trick_simd_c16(b: &mut Bencher) { - assert_eq!(trick_simd_c16(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); - b.bytes = EXAMPLE_TIMESTAMP.len() as u64; - b.iter(|| trick_simd_c16(black_box(EXAMPLE_TIMESTAMP))); -} +// #[bench] +// fn bench_trick_simd_c16(b: &mut Bencher) { +// assert_eq!(trick_simd_c16(EXAMPLE_TIMESTAMP), EXPECTED_TIMESTAMP); +// b.bytes = EXAMPLE_TIMESTAMP.len() as u64; +// b.iter(|| trick_simd_c16(black_box(EXAMPLE_TIMESTAMP))); +// } diff --git a/src/lib.rs b/src/lib.rs index 40616da..65c9788 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,8 +1,9 @@ +//#![feature(unchecked_math)] + use core::arch::x86_64::{ _mm_cvtsi128_si64, _mm_lddqu_si128, _mm_madd_epi16, _mm_maddubs_epi16, _mm_packus_epi32, _mm_set1_epi8, _mm_set_epi16, _mm_set_epi8, _mm_sub_epi16, }; - pub fn str_parse(s: &str) -> u64 { s.parse().unwrap() } @@ -115,7 +116,62 @@ pub fn unrolled_safe(s: &str) -> u64 { pub fn trick(s: &str) -> u64 { let (upper_digits, lower_digits) = s.split_at(8); - parse_8_chars(upper_digits) * 100000000 + parse_8_chars(lower_digits) + parse_8_chars_unchecked(upper_digits) * 100000000 + parse_8_chars_unchecked(lower_digits) +} + +pub fn trick_with_checks(s: &str) -> u64 { + parse_u64(s).unwrap() +} + +pub fn parse_u64(mut s: &str) -> Result { + if s.as_bytes()[0] == b'+' { + s = &s[1..]; + } + let l = s.len(); + if l <= 8 { + if l == 0 { + return Err(()); + } + return parse_8_chars(s); + } + let (upper_digits, lower_digits) = s.split_at(l - 8); + let res = match parse_8_chars(upper_digits)?.checked_mul(100_000_000) + { + Some(res) => res, + None => return Err(()), + }; + match res.checked_add(parse_8_chars(lower_digits)?) { + Some(res) => Ok(res), + None => return Err(()), + } +} + +pub fn trick_with_checks_i64(src: &str) -> i64 { + parse_signed64(src).unwrap() +} + +pub fn parse_signed64(src: &str) -> Result { + let (is_positive, digits) = match src.as_bytes().get(0) { + None => { return Err(()); } + Some(b'-') => (false, &src[1..]), + Some(_) => (true, src), + }; + let i = parse_u64(digits)?; + if is_positive { + if i > i64::MAX as u64 { + return Err(()); + } + Ok(i as i64) + } else { + // Negative + if i > i64::MAX as u64 + 1 { + return Err(()); + } + match 0_i64.checked_sub(i as i64) { + Some(res) => Ok(res), + None => Err(()), + } + } } pub fn trick_128(s: &str) -> u64 { @@ -174,11 +230,39 @@ pub fn trick_simd(s: &str) -> u64 { // parse_8_chars_simd(lower_digits) // } -fn parse_8_chars(s: &str) -> u64 { - let s = s.as_ptr() as *const _; +fn parse_8_chars(s: &str) -> Result { + let l = s.len(); + // if l == 1 { + // let val = s.as_bytes()[0].wrapping_sub(b'0'); + // return if val <= 9 { + // Ok(val as u64) + // } else { + // Err(()) + // } + // } + const MASK_HI: u64 = 0xf0f0f0f0f0f0f0f0u64; + const MASK_LOW: u64 = 0x0f0f0f0f0f0f0f0fu64; + const ASCII_ZEROS: u64 = 0x3030303030303030u64; let mut chunk = 0; unsafe { - std::ptr::copy_nonoverlapping(s, &mut chunk, std::mem::size_of_val(&chunk)); + std::ptr::copy_nonoverlapping( + s.as_ptr() as *const _, + &mut chunk, + std::mem::size_of_val(&chunk), + ); + + // SAFETY: Unknown memory due to < 8 len replaced with with b'0's: + chunk = chunk << ((8 - l) * 8) | 0x3030303030303030u64 >> l * 8; + } + + // See https://graphics.stanford.edu/~seander/bithacks.html#HasMoreInWord + let x = chunk & MASK_LOW; + const RESULT_MASK: u64 = !0u64 / 255 * 128; + const N: u64 = 9; + const N_MASK: u64 = !0u64 / 255 * (127 - N); + if (chunk & MASK_HI) - ASCII_ZEROS | ((x + N_MASK | x) & RESULT_MASK) != 0 { + // _mm_cmpgt_epi8 would also work nicely here if available on target. + return Err(()); } // 1-byte mask trick (works on 4 pairs of single digits) @@ -195,7 +279,33 @@ fn parse_8_chars(s: &str) -> u64 { let lower_digits = (chunk & 0x0000ffff00000000) >> 32; let upper_digits = (chunk & 0x000000000000ffff) * 10000; let chunk = lower_digits + upper_digits; + Ok(chunk) +} + +fn parse_8_chars_unchecked(s: &str) -> u64 { + let mut chunk = 0; + unsafe { + std::ptr::copy_nonoverlapping( + s.as_ptr() as *const _, + &mut chunk, + std::mem::size_of_val(&chunk), + ); + } + + // 1-byte mask trick (works on 4 pairs of single digits) + let lower_digits = (chunk & 0x0f000f000f000f00) >> 8; + let upper_digits = (chunk & 0x000f000f000f000f) * 10; + let chunk = lower_digits + upper_digits; + // 2-byte mask trick (works on 2 pairs of two digits) + let lower_digits = (chunk & 0x00ff000000ff0000) >> 16; + let upper_digits = (chunk & 0x000000ff000000ff) * 100; + let chunk = lower_digits + upper_digits; + + // 4-byte mask trick (works on a pair of four digits) + let lower_digits = (chunk & 0x0000ffff00000000) >> 32; + let upper_digits = (chunk & 0x000000000000ffff) * 10000; + let chunk = lower_digits + upper_digits; chunk } @@ -204,17 +314,17 @@ fn parse_8_chars(s: &str) -> u64 { // let chunk = _mm_loadu_si64(std::mem::transmute_copy(&s)); // let zeros = _mm_set1_epi8(b'0' as i8); // let chunk = _mm_sub_epi16(chunk, zeros); -// + // let mult = _mm_set_epi8(10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1); // let chunk = _mm_maddubs_epi16(chunk, mult); -// + // let mult = _mm_set_epi16(100, 1, 100, 1, 100, 1, 100, 1); // let chunk = _mm_madd_epi16(chunk, mult); -// + // let chunk = _mm_packus_epi32(chunk, chunk); // let mult = _mm_set_epi16(10000, 1, 10000, 1, 10000, 1, 10000, 1); // let chunk = _mm_madd_epi16(chunk, mult); -// + // _mm_cvtsi128_si32(chunk) as u64 // } // } @@ -243,3 +353,16 @@ pub fn trick_simd_c16(s: &str) -> u64 { ((chunk & 0xffffffff) * 100000000) + (chunk >> 32) } } + +const MULTIPLIER: &[u32] = &[ + 1_000_000_000, + 100_000_000, + 10_000_000, + 1_000_000, + 100_000, + 10_000, + 1_000, + 100, + 10, + 1, +]; \ No newline at end of file diff --git a/tags b/tags new file mode 100644 index 0000000..9cafc67 --- /dev/null +++ b/tags @@ -0,0 +1,107 @@ +!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/ +!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/ +!_TAG_OUTPUT_MODE u-ctags /u-ctags or e-ctags/ +!_TAG_PROGRAM_AUTHOR Universal Ctags Team // +!_TAG_PROGRAM_NAME Universal Ctags /Derived from Exuberant Ctags/ +!_TAG_PROGRAM_URL https://ctags.io/ /official site/ +!_TAG_PROGRAM_VERSION 0.0.0 /1208e45/ +0 target/release/.fingerprint/parseint-4bd3d8f62590d6bc/test-lib-parseint.json /^{"rustc":4712542145745680002,"features":"[]","target":7876227839133864575,"profile":174046132101/;" o array:local +0 target/release/.fingerprint/parseint-4c486e2887f16749/test-bench-bench.json /^{"rustc":4712542145745680002,"features":"[]","target":6628690783967570892,"profile":174046132101/;" a array:deps +0 target/release/.fingerprint/parseint-4c486e2887f16749/test-bench-bench.json /^{"rustc":4712542145745680002,"features":"[]","target":6628690783967570892,"profile":174046132101/;" n array:deps.0 +0 target/release/.fingerprint/parseint-4c486e2887f16749/test-bench-bench.json /^{"rustc":4712542145745680002,"features":"[]","target":6628690783967570892,"profile":174046132101/;" o array:local +0 target/release/.fingerprint/parseint-e1ebe09b638d8141/lib-parseint.json /^{"rustc":4712542145745680002,"features":"[]","target":7876227839133864575,"profile":228515222820/;" o array:local +1 target/release/.fingerprint/parseint-4c486e2887f16749/test-bench-bench.json /^{"rustc":4712542145745680002,"features":"[]","target":6628690783967570892,"profile":174046132101/;" s array:deps.0 +17598535894874457435 target/.rustc_info.json /^{"rustc_fingerprint":9851385122578847373,"outputs":{"17598535894874457435":{"success":true,"stat/;" o object:outputs +2 target/release/.fingerprint/parseint-4c486e2887f16749/test-bench-bench.json /^{"rustc":4712542145745680002,"features":"[]","target":6628690783967570892,"profile":174046132101/;" b array:deps.0 +2797684049618456168 target/.rustc_info.json /^{"rustc_fingerprint":9851385122578847373,"outputs":{"17598535894874457435":{"success":true,"stat/;" o object:outputs +3 target/release/.fingerprint/parseint-4c486e2887f16749/test-bench-bench.json /^{"rustc":4712542145745680002,"features":"[]","target":6628690783967570892,"profile":174046132101/;" n array:deps.0 +931469667778813386 target/.rustc_info.json /^{"rustc_fingerprint":9851385122578847373,"outputs":{"17598535894874457435":{"success":true,"stat/;" o object:outputs +CheckDepInfo target/release/.fingerprint/parseint-4bd3d8f62590d6bc/test-lib-parseint.json /^{"rustc":4712542145745680002,"features":"[]","target":7876227839133864575,"profile":174046132101/;" o object:local.0 +CheckDepInfo target/release/.fingerprint/parseint-4c486e2887f16749/test-bench-bench.json /^{"rustc":4712542145745680002,"features":"[]","target":6628690783967570892,"profile":174046132101/;" o object:local.0 +CheckDepInfo target/release/.fingerprint/parseint-e1ebe09b638d8141/lib-parseint.json /^{"rustc":4712542145745680002,"features":"[]","target":7876227839133864575,"profile":228515222820/;" o object:local.0 +Faster Integer Parsing (rust port) README.md /^Faster Integer Parsing (rust port)$/;" c +bench_naive_bytes benches/bench.rs /^fn bench_naive_bytes(b: &mut Bencher) {$/;" f +bench_naive_bytes_and benches/bench.rs /^fn bench_naive_bytes_and(b: &mut Bencher) {$/;" f +bench_naive_bytes_and_c16 benches/bench.rs /^fn bench_naive_bytes_and_c16(b: &mut Bencher) {$/;" f +bench_naive_bytes_iter benches/bench.rs /^fn bench_naive_bytes_iter(b: &mut Bencher) {$/;" f +bench_naive_chars benches/bench.rs /^fn bench_naive_chars(b: &mut Bencher) {$/;" f +bench_naive_chars_and benches/bench.rs /^fn bench_naive_chars_and(b: &mut Bencher) {$/;" f +bench_naive_chars_iter benches/bench.rs /^fn bench_naive_chars_iter(b: &mut Bencher) {$/;" f +bench_str_parse benches/bench.rs /^fn bench_str_parse(b: &mut Bencher) {$/;" f +bench_trick benches/bench.rs /^fn bench_trick(b: &mut Bencher) {$/;" f +bench_trick_128 benches/bench.rs /^fn bench_trick_128(b: &mut Bencher) {$/;" f +bench_trick_simd benches/bench.rs /^fn bench_trick_simd(b: &mut Bencher) {$/;" f +bench_trick_simd_c16 benches/bench.rs /^fn bench_trick_simd_c16(b: &mut Bencher) {$/;" f +bench_unrolled benches/bench.rs /^fn bench_unrolled(b: &mut Bencher) {$/;" f +bench_unrolled_safe benches/bench.rs /^fn bench_unrolled_safe(b: &mut Bencher) {$/;" f +bench_unrolled_unsafe benches/bench.rs /^fn bench_unrolled_unsafe(b: &mut Bencher) {$/;" f +code target/.rustc_info.json /^{"rustc_fingerprint":9851385122578847373,"outputs":{"17598535894874457435":{"success":true,"stat/;" n object:outputs.17598535894874457435 +code target/.rustc_info.json /^{"rustc_fingerprint":9851385122578847373,"outputs":{"17598535894874457435":{"success":true,"stat/;" n object:outputs.2797684049618456168 +code target/.rustc_info.json /^{"rustc_fingerprint":9851385122578847373,"outputs":{"17598535894874457435":{"success":true,"stat/;" n object:outputs.931469667778813386 +compile_kind target/release/.fingerprint/parseint-4bd3d8f62590d6bc/test-lib-parseint.json /^{"rustc":4712542145745680002,"features":"[]","target":7876227839133864575,"profile":174046132101/;" n +compile_kind target/release/.fingerprint/parseint-4c486e2887f16749/test-bench-bench.json /^{"rustc":4712542145745680002,"features":"[]","target":6628690783967570892,"profile":174046132101/;" n +compile_kind target/release/.fingerprint/parseint-e1ebe09b638d8141/lib-parseint.json /^{"rustc":4712542145745680002,"features":"[]","target":7876227839133864575,"profile":228515222820/;" n +config target/release/.fingerprint/parseint-4bd3d8f62590d6bc/test-lib-parseint.json /^{"rustc":4712542145745680002,"features":"[]","target":7876227839133864575,"profile":174046132101/;" n +config target/release/.fingerprint/parseint-4c486e2887f16749/test-bench-bench.json /^{"rustc":4712542145745680002,"features":"[]","target":6628690783967570892,"profile":174046132101/;" n +config target/release/.fingerprint/parseint-e1ebe09b638d8141/lib-parseint.json /^{"rustc":4712542145745680002,"features":"[]","target":7876227839133864575,"profile":228515222820/;" n +dep_info target/release/.fingerprint/parseint-4bd3d8f62590d6bc/test-lib-parseint.json /^{"rustc":4712542145745680002,"features":"[]","target":7876227839133864575,"profile":174046132101/;" s object:local.0.CheckDepInfo +dep_info target/release/.fingerprint/parseint-4c486e2887f16749/test-bench-bench.json /^{"rustc":4712542145745680002,"features":"[]","target":6628690783967570892,"profile":174046132101/;" s object:local.0.CheckDepInfo +dep_info target/release/.fingerprint/parseint-e1ebe09b638d8141/lib-parseint.json /^{"rustc":4712542145745680002,"features":"[]","target":7876227839133864575,"profile":228515222820/;" s object:local.0.CheckDepInfo +deps target/release/.fingerprint/parseint-4bd3d8f62590d6bc/test-lib-parseint.json /^{"rustc":4712542145745680002,"features":"[]","target":7876227839133864575,"profile":174046132101/;" a +deps target/release/.fingerprint/parseint-4c486e2887f16749/test-bench-bench.json /^{"rustc":4712542145745680002,"features":"[]","target":6628690783967570892,"profile":174046132101/;" a +deps target/release/.fingerprint/parseint-e1ebe09b638d8141/lib-parseint.json /^{"rustc":4712542145745680002,"features":"[]","target":7876227839133864575,"profile":228515222820/;" a +features target/release/.fingerprint/parseint-4bd3d8f62590d6bc/test-lib-parseint.json /^{"rustc":4712542145745680002,"features":"[]","target":7876227839133864575,"profile":174046132101/;" s +features target/release/.fingerprint/parseint-4c486e2887f16749/test-bench-bench.json /^{"rustc":4712542145745680002,"features":"[]","target":6628690783967570892,"profile":174046132101/;" s +features target/release/.fingerprint/parseint-e1ebe09b638d8141/lib-parseint.json /^{"rustc":4712542145745680002,"features":"[]","target":7876227839133864575,"profile":228515222820/;" s +local target/release/.fingerprint/parseint-4bd3d8f62590d6bc/test-lib-parseint.json /^{"rustc":4712542145745680002,"features":"[]","target":7876227839133864575,"profile":174046132101/;" a +local target/release/.fingerprint/parseint-4c486e2887f16749/test-bench-bench.json /^{"rustc":4712542145745680002,"features":"[]","target":6628690783967570892,"profile":174046132101/;" a +local target/release/.fingerprint/parseint-e1ebe09b638d8141/lib-parseint.json /^{"rustc":4712542145745680002,"features":"[]","target":7876227839133864575,"profile":228515222820/;" a +metadata target/release/.fingerprint/parseint-4bd3d8f62590d6bc/test-lib-parseint.json /^{"rustc":4712542145745680002,"features":"[]","target":7876227839133864575,"profile":174046132101/;" n +metadata target/release/.fingerprint/parseint-4c486e2887f16749/test-bench-bench.json /^{"rustc":4712542145745680002,"features":"[]","target":6628690783967570892,"profile":174046132101/;" n +metadata target/release/.fingerprint/parseint-e1ebe09b638d8141/lib-parseint.json /^{"rustc":4712542145745680002,"features":"[]","target":7876227839133864575,"profile":228515222820/;" n +naive_bytes src/lib.rs /^pub fn naive_bytes(s: &str) -> u64 {$/;" f +naive_bytes_and src/lib.rs /^pub fn naive_bytes_and(s: &str) -> u64 {$/;" f +naive_bytes_and_c16 src/lib.rs /^pub fn naive_bytes_and_c16(s: &str) -> u64 {$/;" f +naive_bytes_iter src/lib.rs /^pub fn naive_bytes_iter(s: &str) -> u64 {$/;" f +naive_chars src/lib.rs /^pub fn naive_chars(s: &str) -> u64 {$/;" f +naive_chars_and src/lib.rs /^pub fn naive_chars_and(s: &str) -> u64 {$/;" f +naive_chars_iter src/lib.rs /^pub fn naive_chars_iter(s: &str) -> u64 {$/;" f +outputs target/.rustc_info.json /^{"rustc_fingerprint":9851385122578847373,"outputs":{"17598535894874457435":{"success":true,"stat/;" o +parse_8_chars src/lib.rs /^fn parse_8_chars(s: &str) -> u64 {$/;" f +path target/release/.fingerprint/parseint-4bd3d8f62590d6bc/test-lib-parseint.json /^{"rustc":4712542145745680002,"features":"[]","target":7876227839133864575,"profile":174046132101/;" n +path target/release/.fingerprint/parseint-4c486e2887f16749/test-bench-bench.json /^{"rustc":4712542145745680002,"features":"[]","target":6628690783967570892,"profile":174046132101/;" n +path target/release/.fingerprint/parseint-e1ebe09b638d8141/lib-parseint.json /^{"rustc":4712542145745680002,"features":"[]","target":7876227839133864575,"profile":228515222820/;" n +profile target/release/.fingerprint/parseint-4bd3d8f62590d6bc/test-lib-parseint.json /^{"rustc":4712542145745680002,"features":"[]","target":7876227839133864575,"profile":174046132101/;" n +profile target/release/.fingerprint/parseint-4c486e2887f16749/test-bench-bench.json /^{"rustc":4712542145745680002,"features":"[]","target":6628690783967570892,"profile":174046132101/;" n +profile target/release/.fingerprint/parseint-e1ebe09b638d8141/lib-parseint.json /^{"rustc":4712542145745680002,"features":"[]","target":7876227839133864575,"profile":228515222820/;" n +rustc target/release/.fingerprint/parseint-4bd3d8f62590d6bc/test-lib-parseint.json /^{"rustc":4712542145745680002,"features":"[]","target":7876227839133864575,"profile":174046132101/;" n +rustc target/release/.fingerprint/parseint-4c486e2887f16749/test-bench-bench.json /^{"rustc":4712542145745680002,"features":"[]","target":6628690783967570892,"profile":174046132101/;" n +rustc target/release/.fingerprint/parseint-e1ebe09b638d8141/lib-parseint.json /^{"rustc":4712542145745680002,"features":"[]","target":7876227839133864575,"profile":228515222820/;" n +rustc_fingerprint target/.rustc_info.json /^{"rustc_fingerprint":9851385122578847373,"outputs":{"17598535894874457435":{"success":true,"stat/;" n +rustflags target/release/.fingerprint/parseint-4bd3d8f62590d6bc/test-lib-parseint.json /^{"rustc":4712542145745680002,"features":"[]","target":7876227839133864575,"profile":174046132101/;" a +rustflags target/release/.fingerprint/parseint-4c486e2887f16749/test-bench-bench.json /^{"rustc":4712542145745680002,"features":"[]","target":6628690783967570892,"profile":174046132101/;" a +rustflags target/release/.fingerprint/parseint-e1ebe09b638d8141/lib-parseint.json /^{"rustc":4712542145745680002,"features":"[]","target":7876227839133864575,"profile":228515222820/;" a +status target/.rustc_info.json /^{"rustc_fingerprint":9851385122578847373,"outputs":{"17598535894874457435":{"success":true,"stat/;" s object:outputs.17598535894874457435 +status target/.rustc_info.json /^{"rustc_fingerprint":9851385122578847373,"outputs":{"17598535894874457435":{"success":true,"stat/;" s object:outputs.2797684049618456168 +status target/.rustc_info.json /^{"rustc_fingerprint":9851385122578847373,"outputs":{"17598535894874457435":{"success":true,"stat/;" s object:outputs.931469667778813386 +stderr target/.rustc_info.json /^{"rustc_fingerprint":9851385122578847373,"outputs":{"17598535894874457435":{"success":true,"stat/;" s object:outputs.17598535894874457435 +stderr target/.rustc_info.json /^{"rustc_fingerprint":9851385122578847373,"outputs":{"17598535894874457435":{"success":true,"stat/;" s object:outputs.2797684049618456168 +stderr target/.rustc_info.json /^{"rustc_fingerprint":9851385122578847373,"outputs":{"17598535894874457435":{"success":true,"stat/;" s object:outputs.931469667778813386 +stdout target/.rustc_info.json /^{"rustc_fingerprint":9851385122578847373,"outputs":{"17598535894874457435":{"success":true,"stat/;" s object:outputs.17598535894874457435 +stdout target/.rustc_info.json /^{"rustc_fingerprint":9851385122578847373,"outputs":{"17598535894874457435":{"success":true,"stat/;" s object:outputs.2797684049618456168 +stdout target/.rustc_info.json /^{"rustc_fingerprint":9851385122578847373,"outputs":{"17598535894874457435":{"success":true,"stat/;" s object:outputs.931469667778813386 +str_parse src/lib.rs /^pub fn str_parse(s: &str) -> u64 {$/;" f +success target/.rustc_info.json /^{"rustc_fingerprint":9851385122578847373,"outputs":{"17598535894874457435":{"success":true,"stat/;" b object:outputs.17598535894874457435 +success target/.rustc_info.json /^{"rustc_fingerprint":9851385122578847373,"outputs":{"17598535894874457435":{"success":true,"stat/;" b object:outputs.2797684049618456168 +success target/.rustc_info.json /^{"rustc_fingerprint":9851385122578847373,"outputs":{"17598535894874457435":{"success":true,"stat/;" b object:outputs.931469667778813386 +successes target/.rustc_info.json /^{"rustc_fingerprint":9851385122578847373,"outputs":{"17598535894874457435":{"success":true,"stat/;" o +target target/release/.fingerprint/parseint-4bd3d8f62590d6bc/test-lib-parseint.json /^{"rustc":4712542145745680002,"features":"[]","target":7876227839133864575,"profile":174046132101/;" n +target target/release/.fingerprint/parseint-4c486e2887f16749/test-bench-bench.json /^{"rustc":4712542145745680002,"features":"[]","target":6628690783967570892,"profile":174046132101/;" n +target target/release/.fingerprint/parseint-e1ebe09b638d8141/lib-parseint.json /^{"rustc":4712542145745680002,"features":"[]","target":7876227839133864575,"profile":228515222820/;" n +trick src/lib.rs /^pub fn trick(s: &str) -> u64 {$/;" f +trick_128 src/lib.rs /^pub fn trick_128(s: &str) -> u64 {$/;" f +trick_simd src/lib.rs /^pub fn trick_simd(s: &str) -> u64 {$/;" f +trick_simd_c16 src/lib.rs /^pub fn trick_simd_c16(s: &str) -> u64 {$/;" f +unrolled src/lib.rs /^pub fn unrolled(s: &str) -> u64 {$/;" f +unrolled_safe src/lib.rs /^pub fn unrolled_safe(s: &str) -> u64 {$/;" f +unrolled_unsafe src/lib.rs /^pub fn unrolled_unsafe(s: &str) -> u64 {$/;" f