From 5e54bb3458a5c784d4091b8fe5993152c49e5f7c Mon Sep 17 00:00:00 2001 From: alisdair sullivan Date: Sun, 10 Mar 2013 19:54:43 -0700 Subject: [PATCH] perf enhancements in string --- src/jsx_decoder.erl | 253 ++++++++++++++++++++++---------------------- 1 file changed, 127 insertions(+), 126 deletions(-) diff --git a/src/jsx_decoder.erl b/src/jsx_decoder.erl index 61d5567..1f146b8 100644 --- a/src/jsx_decoder.erl +++ b/src/jsx_decoder.erl @@ -293,130 +293,9 @@ key(Bin, Handler, Stack, Config) -> %% explicitly whitelist ascii set for faster parsing. really? really. someone should %% submit a patch that unrolls simple guards +%% ordering is for efficiency but is nowhere near optimal %% note that if you encounter an error from string and you can't find the clause that %% caused it here, it might be in unescape below -string(<<32, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 32), Stack, Config); -string(<<33, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 33), Stack, Config); -string(<<35, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 35), Stack, Config); -string(<<36, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 36), Stack, Config); -string(<<37, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 37), Stack, Config); -string(<<38, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 38), Stack, Config); -string(<<40, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 40), Stack, Config); -string(<<41, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 41), Stack, Config); -string(<<42, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 42), Stack, Config); -string(<<43, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 43), Stack, Config); -string(<<44, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 44), Stack, Config); -string(<<45, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 45), Stack, Config); -string(<<46, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 46), Stack, Config); -string(<<48, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 48), Stack, Config); -string(<<49, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 49), Stack, Config); -string(<<50, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 50), Stack, Config); -string(<<51, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 51), Stack, Config); -string(<<52, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 52), Stack, Config); -string(<<53, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 53), Stack, Config); -string(<<54, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 54), Stack, Config); -string(<<55, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 55), Stack, Config); -string(<<56, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 56), Stack, Config); -string(<<57, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 57), Stack, Config); -string(<<58, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 58), Stack, Config); -string(<<59, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 59), Stack, Config); -string(<<60, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 60), Stack, Config); -string(<<61, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 61), Stack, Config); -string(<<62, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 62), Stack, Config); -string(<<63, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 63), Stack, Config); -string(<<64, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 64), Stack, Config); -string(<<65, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 65), Stack, Config); -string(<<66, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 66), Stack, Config); -string(<<67, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 67), Stack, Config); -string(<<68, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 68), Stack, Config); -string(<<69, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 69), Stack, Config); -string(<<70, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 70), Stack, Config); -string(<<71, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 71), Stack, Config); -string(<<72, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 72), Stack, Config); -string(<<73, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 73), Stack, Config); -string(<<74, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 74), Stack, Config); -string(<<75, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 75), Stack, Config); -string(<<76, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 76), Stack, Config); -string(<<77, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 77), Stack, Config); -string(<<78, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 78), Stack, Config); -string(<<79, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 79), Stack, Config); -string(<<80, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 80), Stack, Config); -string(<<81, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 81), Stack, Config); -string(<<82, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 82), Stack, Config); -string(<<83, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 83), Stack, Config); -string(<<84, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 84), Stack, Config); -string(<<85, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 85), Stack, Config); -string(<<86, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 86), Stack, Config); -string(<<87, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 87), Stack, Config); -string(<<88, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 88), Stack, Config); -string(<<89, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 89), Stack, Config); -string(<<90, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 90), Stack, Config); -string(<<91, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 91), Stack, Config); -string(<<93, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 93), Stack, Config); -string(<<94, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 94), Stack, Config); -string(<<95, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 95), Stack, Config); -string(<<96, Rest/binary>>, Handler, Acc, Stack, Config) -> - string(Rest, Handler, acc_seq(Acc, 96), Stack, Config); string(<<97, Rest/binary>>, Handler, Acc, Stack, Config) -> string(Rest, Handler, acc_seq(Acc, 97), Stack, Config); string(<<98, Rest/binary>>, Handler, Acc, Stack, Config) -> @@ -469,6 +348,132 @@ string(<<121, Rest/binary>>, Handler, Acc, Stack, Config) -> string(Rest, Handler, acc_seq(Acc, 121), Stack, Config); string(<<122, Rest/binary>>, Handler, Acc, Stack, Config) -> string(Rest, Handler, acc_seq(Acc, 122), Stack, Config); +string(<<48, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 48), Stack, Config); +string(<<49, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 49), Stack, Config); +string(<<50, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 50), Stack, Config); +string(<<51, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 51), Stack, Config); +string(<<52, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 52), Stack, Config); +string(<<53, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 53), Stack, Config); +string(<<54, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 54), Stack, Config); +string(<<55, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 55), Stack, Config); +string(<<56, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 56), Stack, Config); +string(<<57, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 57), Stack, Config); +string(<<65, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 65), Stack, Config); +string(<<66, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 66), Stack, Config); +string(<<67, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 67), Stack, Config); +string(<<68, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 68), Stack, Config); +string(<<69, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 69), Stack, Config); +string(<<70, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 70), Stack, Config); +string(<<71, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 71), Stack, Config); +string(<<72, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 72), Stack, Config); +string(<<73, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 73), Stack, Config); +string(<<74, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 74), Stack, Config); +string(<<75, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 75), Stack, Config); +string(<<76, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 76), Stack, Config); +string(<<77, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 77), Stack, Config); +string(<<78, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 78), Stack, Config); +string(<<79, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 79), Stack, Config); +string(<<80, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 80), Stack, Config); +string(<<81, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 81), Stack, Config); +string(<<82, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 82), Stack, Config); +string(<<83, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 83), Stack, Config); +string(<<84, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 84), Stack, Config); +string(<<85, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 85), Stack, Config); +string(<<86, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 86), Stack, Config); +string(<<87, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 87), Stack, Config); +string(<<88, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 88), Stack, Config); +string(<<89, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 89), Stack, Config); +string(<<90, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 90), Stack, Config); +string(<<32, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 32), Stack, Config); +string(<<33, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 33), Stack, Config); +string(<>, Handler, Acc, Stack, Config) -> + doublequote(Rest, Handler, Acc, Stack, Config); +string(<<35, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 35), Stack, Config); +string(<<36, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 36), Stack, Config); +string(<<37, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 37), Stack, Config); +string(<<38, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 38), Stack, Config); +string(<>, Handler, Acc, Stack, Config) -> + singlequote(Rest, Handler, Acc, Stack, Config); +string(<<40, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 40), Stack, Config); +string(<<41, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 41), Stack, Config); +string(<<42, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 42), Stack, Config); +string(<<43, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 43), Stack, Config); +string(<<44, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 44), Stack, Config); +string(<<45, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 45), Stack, Config); +string(<<46, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 46), Stack, Config); +string(<<58, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 58), Stack, Config); +string(<<59, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 59), Stack, Config); +string(<<60, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 60), Stack, Config); +string(<<61, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 61), Stack, Config); +string(<<62, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 62), Stack, Config); +string(<<63, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 63), Stack, Config); +string(<<64, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 64), Stack, Config); +string(<<91, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 91), Stack, Config); +string(<<93, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 93), Stack, Config); +string(<<94, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 94), Stack, Config); +string(<<95, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 95), Stack, Config); +string(<<96, Rest/binary>>, Handler, Acc, Stack, Config) -> + string(Rest, Handler, acc_seq(Acc, 96), Stack, Config); string(<<123, Rest/binary>>, Handler, Acc, Stack, Config) -> string(Rest, Handler, acc_seq(Acc, 123), Stack, Config); string(<<124, Rest/binary>>, Handler, Acc, Stack, Config) -> @@ -479,10 +484,6 @@ string(<<126, Rest/binary>>, Handler, Acc, Stack, Config) -> string(Rest, Handler, acc_seq(Acc, 126), Stack, Config); string(<<127, Rest/binary>>, Handler, Acc, Stack, Config) -> string(Rest, Handler, acc_seq(Acc, 127), Stack, Config); -string(<>, Handler, Acc, Stack, Config) -> - doublequote(Rest, Handler, Acc, Stack, Config); -string(<>, Handler, Acc, Stack, Config) -> - singlequote(Rest, Handler, Acc, Stack, Config); string(<>, Handler, Acc, Stack, Config) -> unescape(Rest, Handler, Acc, Stack, Config); string(<>, Handler, Acc, Stack, Config) ->