diff --git a/benchmark.txt b/benchmark.txt index 1313221..9db7c6f 100644 --- a/benchmark.txt +++ b/benchmark.txt @@ -5,3 +5,4 @@ 95 FxHashMap 71 mmap, reduced UTF8 parsing (names) 50 manual number parsing + 48 unchecked unwrap diff --git a/src/main.rs b/src/main.rs index bd8b9e5..eb2ec99 100644 --- a/src/main.rs +++ b/src/main.rs @@ -29,9 +29,9 @@ fn main() { let line = &mmap[pointer..pointer + length]; let mut split = line.split(|&c| c == b';'); - let station = split.next().unwrap(); - let number = split.next().unwrap(); - let parsed = parse_number(number); + let station = unsafe { split.next().unwrap_unchecked() }; + let number = unsafe { split.next().unwrap_unchecked() }; + let parsed = unsafe { parse_number(number) }; // panic!(); data.entry(station) @@ -70,27 +70,29 @@ fn main() { println!("}}"); } -fn parse_number(number: &[u8]) -> i64 { - let sign = if *number.first().unwrap() == b'-' { - -1 - } else { - 1 - }; +unsafe fn parse_number(number: &[u8]) -> i64 { + unsafe { + let sign = if *number.first().unwrap_unchecked() == b'-' { + -1 + } else { + 1 + }; - let mut iter = number.iter().rev(); + let mut iter = number.iter().rev(); - // 48: ASCII '0' - let mut result = (iter.next().unwrap() - 48) as i64; - iter.next(); // skip '.' - result += ((iter.next().unwrap() - 48) as i64) * 10; + // 48: ASCII '0' + let mut result = (iter.next().unwrap_unchecked() - 48) as i64; + iter.next(); // skip '.' + result += ((iter.next().unwrap_unchecked() - 48) as i64) * 10; - if let Some(hundreds) = iter.next() - && *hundreds != b'-' - { - result += ((hundreds - 48) as i64) * 100; + if let Some(hundreds) = iter.next() + && *hundreds != b'-' + { + result += ((hundreds - 48) as i64) * 100; + } + + sign * result } - - sign * result } #[cfg(test)] @@ -100,6 +102,6 @@ mod tests { #[test] fn test_parse_number() { let input = [49, 53, 46, 51]; // "15.3" - assert_eq!(parse_number(&input), 153); + assert_eq!(unsafe { parse_number(&input) }, 153); } }