mirror of
https://github.com/nlohmann/json.git
synced 2026-11-03 11:25:33 +00:00
accept(): its own lexer instead of a run-time choice in scan()
The lexer chose between the copying and the checking string scan at run time in scan(). Both scans were then inlined into the scan() of parse() as well, which made json::parse() of jeopardy.json indented by 4 2 % slower on Apple M1 (same instruction count). Whether token values are discarded is now a template parameter (DiscardValues) of lexer and parser, false by default; only accept() instantiates the parser with true. parse() gets a lexer with the copying scan only, and without the run-time checks of the number paths. Apple M1, A/B against develop, 6 code layouts: parse() of indented jeopardy 1.020 -> 1.003, twitter 1.006 -> 1.005; accept() twitter 1.012 -> 1.002, tree-pretty 1.016 -> 1.004, mesh 1.000 -> 0.940, twitter_min 0.990 -> 1.009, citm_catalog 0.937 -> 0.950, gsoc-2018 0.838 -> 0.836. Signed-off-by: Niels Lohmann <mail@nlohmann.me>
This commit is contained in:
4 files changed
+60
-44
No files matched your search
@@ -72,14 +72,14 @@ This class implements a parser for JSON text. Nested arrays and objects are trac
|
||||
stack instead of recursion, so deeply nested input does not exhaust the call stack, and what is read
|
||||
is reported as SAX events.
|
||||
*/
|
||||
template<typename BasicJsonType, typename InputAdapterType>
|
||||
template<typename BasicJsonType, typename InputAdapterType, bool DiscardValues = false>
|
||||
class parser
|
||||
{
|
||||
using number_integer_t = typename BasicJsonType::number_integer_t;
|
||||
using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
|
||||
using number_float_t = typename BasicJsonType::number_float_t;
|
||||
using string_t = typename BasicJsonType::string_t;
|
||||
using lexer_t = lexer<BasicJsonType, InputAdapterType>;
|
||||
using lexer_t = lexer<BasicJsonType, InputAdapterType, DiscardValues>;
|
||||
using token_type = typename lexer_t::token_type;
|
||||
|
||||
public:
|
||||
@@ -88,10 +88,9 @@ class parser
|
||||
parser_callback_t<BasicJsonType> cb = nullptr,
|
||||
const bool allow_exceptions_ = true,
|
||||
const bool ignore_comments = false,
|
||||
const bool ignore_trailing_commas_ = false,
|
||||
const bool discard_values_ = false)
|
||||
const bool ignore_trailing_commas_ = false)
|
||||
: callback(std::move(cb))
|
||||
, m_lexer(std::move(adapter), ignore_comments, discard_values_)
|
||||
, m_lexer(std::move(adapter), ignore_comments)
|
||||
, allow_exceptions(allow_exceptions_)
|
||||
, ignore_trailing_commas(ignore_trailing_commas_)
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user