changeset 15:36e01274a263

primitives: Benchmark for integer parsing.
author Lewin Bormann <lewin@lewin-bormann.info>
date Mon, 03 Jun 2019 23:14:25 +0200
parents 4122b5f7562b
children 9ad913fdbef1
files Cargo.toml src/lib.rs src/primitives.rs
diffstat 3 files changed, 43 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/Cargo.toml	Mon Jun 03 23:14:01 2019 +0200
+++ b/Cargo.toml	Mon Jun 03 23:14:25 2019 +0200
@@ -7,4 +7,5 @@
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
-utf8reader = "0.1.0"
+time-test = "0.2"
+utf8reader = "0.1"
--- a/src/lib.rs	Mon Jun 03 23:14:01 2019 +0200
+++ b/src/lib.rs	Mon Jun 03 23:14:25 2019 +0200
@@ -1,5 +1,8 @@
 #![allow(dead_code)]
 
+#[macro_use]
+extern crate time_test;
+
 mod combinators;
 mod parser;
 mod primitives;
--- a/src/primitives.rs	Mon Jun 03 23:14:01 2019 +0200
+++ b/src/primitives.rs	Mon Jun 03 23:14:25 2019 +0200
@@ -206,6 +206,7 @@
 #[cfg(test)]
 mod tests {
     use super::*;
+    use crate::combinators::Sequence;
 
     #[test]
     fn test_parse_string() {
@@ -217,7 +218,7 @@
 
     #[test]
     fn test_parse_int() {
-        let mut s = ParseState::new("-1252 353 354 -1253");
+        let mut s = ParseState::new("-1252 353 354 -1253 422345");
         let mut ip = Int64::new();
         let mut up = Uint64::new();
         let mut sp = StringParser::new(" ".to_string());
@@ -228,6 +229,9 @@
         assert_eq!(Ok(354), up.parse(&mut s));
         assert_eq!(Ok(" ".to_string()), sp.parse(&mut s));
         assert!(up.parse(&mut s).is_err());
+        assert_eq!(Ok(-1253), ip.parse(&mut s));
+        assert_eq!(Ok(" ".to_string()), sp.parse(&mut s));
+        assert_eq!(Ok(422345), up.parse(&mut s));
     }
 
     #[test]
@@ -250,4 +254,37 @@
         let mut p = string_none_of("xyz", RepeatSpec::Min(1));
         assert_eq!(Ok("aaabc".to_string()), p.parse(&mut st));
     }
+
+    use std::iter;
+
+    #[test]
+    fn bench_integer_medium() {
+        let piece = "-422345 ";
+        let repeats = 1000;
+        let mut input = String::with_capacity(piece.len() * repeats);
+        input.extend(iter::repeat(piece).take(repeats));
+        let mut ps = ParseState::new(&input);
+        let mut p = Sequence::new((Int64::new(), StringParser::new(" ")));
+        {
+            time_test!("parse-int with static buffer");
+            for i in 0..1000 {
+                let h = ps.hold();
+                let r = p.parse(&mut ps);
+                ps.reset(h);
+            }
+        }
+
+        let piece = "-42234511 ";
+        let mut input = String::with_capacity(piece.len() * repeats);
+        input.extend(iter::repeat(piece).take(repeats));
+        let mut ps = ParseState::new(&input);
+        {
+            time_test!("parse-int with dynamic buffer");
+            for i in 0..1000 {
+                let h = ps.hold();
+                let r = p.parse(&mut ps);
+                ps.reset(h);
+            }
+        }
+    }
 }