From 158c248d5cdee5ffacc3f35e567682021b78c31c Mon Sep 17 00:00:00 2001 From: Ramiro Polla Date: Sat, 8 Dec 2018 19:07:49 +0100 Subject: [PATCH] json_tokener: optimize check for whitespace characters speedup for 32-bit: ~15% speedup for 64-bit: ~ 2% --- json_tokener.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/json_tokener.c b/json_tokener.c index 561f730..d168e3f 100644 --- a/json_tokener.c +++ b/json_tokener.c @@ -50,6 +50,22 @@ # error You do not have strncasecmp on your system. #endif /* HAVE_STRNCASECMP */ +/* The following helper functions are used to speed up parsing. They + * are faster than their ctype counterparts because they assume that + * the input is in ASCII and that the locale is set to "C". The + * compiler will also inline these functions, providing an additional + * speedup by saving on function calls. + */ +static int is_ws_char(char c) +{ + return c == ' ' + || c == '\t' + || c == '\n' + || c == '\v' + || c == '\f' + || c == '\r'; +} + /* Use C99 NAN by default; if not available, nan("") should work too. */ #ifndef NAN #define NAN nan("") @@ -295,7 +311,7 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok, case json_tokener_state_eatws: /* Advance until we change state */ - while (isspace((unsigned char)c)) { + while (is_ws_char(c)) { if ((!ADVANCE_CHAR(str, tok)) || (!PEEK_CHAR(c, tok))) goto out; } -- 2.50.1