From 4e004a664fb69a0f94bd7ad140e0ef0776d01a3d Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 4 Aug 2019 18:22:41 +0200 Subject: [PATCH] JsonParser: Cache the last seen string starting with each possible char Keep a 256-entry string cache during parse to avoid creating some new strings when possible. This cache is far from perfect but very cheap. Since none of the strings are transient, this only costs us a couple of pointers and a bit of ref-count manipulation. The cache hit rate on 4chan_catalog.json is ~33% and the speedup on the load_4chan_catalog benchmark is ~7%. --- AK/JsonParser.cpp | 13 ++++++++++++- AK/JsonParser.h | 2 ++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/AK/JsonParser.cpp b/AK/JsonParser.cpp index 9d604fa2a8..7960a14cfe 100644 --- a/AK/JsonParser.cpp +++ b/AK/JsonParser.cpp @@ -92,7 +92,18 @@ String JsonParser::consume_quoted_string() } } consume_specific('"'); - return String::copy(buffer); + + if (buffer.is_empty()) + return {}; + + auto& last_string_starting_with_character = m_last_string_starting_with_character[buffer.first()]; + if (last_string_starting_with_character.length() == buffer.size()) { + if (!memcmp(last_string_starting_with_character.characters(), buffer.data(), buffer.size())) + return last_string_starting_with_character; + } + + last_string_starting_with_character = String::copy(buffer); + return last_string_starting_with_character; } JsonObject JsonParser::parse_object() diff --git a/AK/JsonParser.h b/AK/JsonParser.h index 343530d7f4..26756abf36 100644 --- a/AK/JsonParser.h +++ b/AK/JsonParser.h @@ -40,6 +40,8 @@ private: StringView m_input; int m_index { 0 }; + + String m_last_string_starting_with_character[256]; }; }