From 133d26904559903a392c6aaeb3d6990b59995b47 Mon Sep 17 00:00:00 2001 From: Joshua Simmons Date: Sun, 25 Sep 2022 17:10:09 +0200 Subject: [PATCH] Improve perf of obj parser --- narcissus-core/src/obj.rs | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/narcissus-core/src/obj.rs b/narcissus-core/src/obj.rs index 64f0b38..5d9e80f 100644 --- a/narcissus-core/src/obj.rs +++ b/narcissus-core/src/obj.rs @@ -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; } -- 2.49.0