]> git.nega.tv - josh/narcissus/commitdiff
Improve perf of obj parser
authorJoshua Simmons <josh@nega.tv>
Sun, 25 Sep 2022 15:10:09 +0000 (17:10 +0200)
committerJoshua Simmons <josh@nega.tv>
Sun, 25 Sep 2022 15:10:09 +0000 (17:10 +0200)
narcissus-core/src/obj.rs

index 64f0b38f00ccf540c42227da02620a6769b4ea7a..5d9e80fe4dec784047fc2248441e5477ca9ed176 100644 (file)
@@ -261,10 +261,34 @@ where
             let read = self.reader.read(&mut self.buf[self.cap..])?;
             self.cap += read;
 
+            const IS_NEWLINE_LUT: [bool; 256] = [
+                false, false, false, false, false, false, false, false, false, false, true, false,
+                false, true, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false, false, false, false, false, false, false, false, false,
+                false, false, false, false,
+            ];
+
             for (i, &c) in self.buf[..self.cap].iter().enumerate() {
-                let is_newline = (c == b'\n') | (c == b'\r');
                 // skip empty lines
-                if (i - self.pos) > 1 && is_newline {
+                if IS_NEWLINE_LUT[c as usize] && (i - self.pos) > 1 {
                     parse_line(&self.buf[self.pos..i], visitor)?;
                     self.pos = i + 1;
                 }