Skip to content

Commit 1ccc577

Browse files
authored
parser: Use a lookup table for Delimiter::from_byte. (#358)
* parser: Use a lookup table for Delimiter::from_byte. It's faster. * tests: Add a benchmark for Delimiters::from_byte
1 parent c97ba60 commit 1ccc577

File tree

2 files changed

+28
-10
lines changed

2 files changed

+28
-10
lines changed

src/parser.rs

+15-9
Original file line numberDiff line numberDiff line change
@@ -335,16 +335,22 @@ impl Delimiters {
335335
}
336336

337337
#[inline]
338-
fn from_byte(byte: Option<u8>) -> Delimiters {
338+
pub(crate) fn from_byte(byte: Option<u8>) -> Delimiters {
339+
const TABLE: [Delimiters; 256] = {
340+
let mut table = [Delimiter::None; 256];
341+
table[b';' as usize] = Delimiter::Semicolon;
342+
table[b'!' as usize] = Delimiter::Bang;
343+
table[b',' as usize] = Delimiter::Comma;
344+
table[b'{' as usize] = Delimiter::CurlyBracketBlock;
345+
table[b'}' as usize] = ClosingDelimiter::CloseCurlyBracket;
346+
table[b']' as usize] = ClosingDelimiter::CloseSquareBracket;
347+
table[b')' as usize] = ClosingDelimiter::CloseParenthesis;
348+
table
349+
};
350+
339351
match byte {
340-
Some(b';') => Delimiter::Semicolon,
341-
Some(b'!') => Delimiter::Bang,
342-
Some(b',') => Delimiter::Comma,
343-
Some(b'{') => Delimiter::CurlyBracketBlock,
344-
Some(b'}') => ClosingDelimiter::CloseCurlyBracket,
345-
Some(b']') => ClosingDelimiter::CloseSquareBracket,
346-
Some(b')') => ClosingDelimiter::CloseParenthesis,
347-
_ => Delimiter::None,
352+
None => Delimiter::None,
353+
Some(b) => TABLE[b as usize],
348354
}
349355
}
350356
}

src/tests.rs

+13-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use encoding_rs;
99
use serde_json::{self, json, Map, Value};
1010

1111
use crate::color::{parse_color_with, FromParsedColor};
12-
use crate::{ColorParser, PredefinedColorSpace};
12+
use crate::{ColorParser, PredefinedColorSpace, Delimiters};
1313

1414
#[cfg(feature = "bench")]
1515
use self::test::Bencher;
@@ -922,6 +922,18 @@ impl<'a> ToJson for CowRcStr<'a> {
922922
}
923923
}
924924

925+
#[bench]
926+
#[cfg(feature = "bench")]
927+
fn delimiter_from_byte(b: &mut Bencher) {
928+
b.iter(|| {
929+
for _ in 0..1000 {
930+
for i in 0..256 {
931+
std::hint::black_box(Delimiters::from_byte(Some(i as u8)));
932+
}
933+
}
934+
})
935+
}
936+
925937
#[cfg(feature = "bench")]
926938
const BACKGROUND_IMAGE: &'static str = include_str!("big-data-url.css");
927939

0 commit comments

Comments
 (0)