From 3bdfca1119d1ed5e706bfc5123dc472bbf43e6e0 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 23 Mar 2024 20:03:38 +0100 Subject: [PATCH] AK: Make FlyString::from_utf8*() avoid allocation if possible If we already have a FlyString instantiated for the given string, look that up and return it instead of making a temporary String just to use as a key into the FlyString table. --- AK/FlyString.cpp | 12 ++++++++++++ AK/FlyString.h | 5 +++++ 2 files changed, 17 insertions(+) diff --git a/AK/FlyString.cpp b/AK/FlyString.cpp index 43d1129e15..b7cd4d0e5d 100644 --- a/AK/FlyString.cpp +++ b/AK/FlyString.cpp @@ -28,11 +28,23 @@ static auto& all_fly_strings() ErrorOr FlyString::from_utf8(StringView string) { + if (string.is_empty()) + return FlyString {}; + if (string.length() <= Detail::MAX_SHORT_STRING_BYTE_COUNT) + return FlyString { TRY(String::from_utf8(string)) }; + if (auto it = all_fly_strings().find(string.hash(), [&](auto& entry) { return entry->bytes_as_string_view() == string; }); it != all_fly_strings().end()) + return FlyString { Detail::StringBase(**it) }; return FlyString { TRY(String::from_utf8(string)) }; } FlyString FlyString::from_utf8_without_validation(ReadonlyBytes string) { + if (string.is_empty()) + return FlyString {}; + if (string.size() <= Detail::MAX_SHORT_STRING_BYTE_COUNT) + return FlyString { String::from_utf8_without_validation(string) }; + if (auto it = all_fly_strings().find(StringView(string).hash(), [&](auto& entry) { return entry->bytes_as_string_view() == string; }); it != all_fly_strings().end()) + return FlyString { Detail::StringBase(**it) }; return FlyString { String::from_utf8_without_validation(string) }; } diff --git a/AK/FlyString.h b/AK/FlyString.h index 319079bfed..df2ce8fdd3 100644 --- a/AK/FlyString.h +++ b/AK/FlyString.h @@ -77,6 +77,11 @@ public: } private: + explicit FlyString(Detail::StringBase data) + : m_data(move(data)) + { + } + Detail::StringBase m_data; };