summaryrefslogtreecommitdiff
path: root/src/shared_string.cc
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2023-11-17 17:01:51 +1100
committerMaxime Coste <mawww@kakoune.org>2023-11-17 17:01:51 +1100
commit296ab1a1ffb707f4691cdce21172b3b8d0b48eb0 (patch)
tree6388c07b53a5cfda953b92c058a819684bcec67f /src/shared_string.cc
parentb10a935b8ceb18f256bd04843a5442d7c746abdb (diff)
Improve WordDB performance by precomputing hashes
Avoid multiple computation of string hashes by making it possible to pre-compute and pass hashes to interned strings and hash maps.
Diffstat (limited to 'src/shared_string.cc')
-rw-r--r--src/shared_string.cc16
1 files changed, 11 insertions, 5 deletions
diff --git a/src/shared_string.cc b/src/shared_string.cc
index 752ac828..7291699c 100644
--- a/src/shared_string.cc
+++ b/src/shared_string.cc
@@ -25,18 +25,24 @@ StringDataPtr StringData::create(ArrayView<const StringView> strs)
return RefPtr<StringData, PtrPolicy>{res};
}
-StringDataPtr StringData::Registry::intern(StringView str)
+StringDataPtr StringData::Registry::intern(StringView str, size_t hash)
{
- auto it = m_strings.find(str);
- if (it != m_strings.end())
- return StringDataPtr{it->value};
+ kak_assert(hash_value(str) == hash);
+ auto index = m_strings.find_index(str, hash);
+ if (index >= 0)
+ return StringDataPtr{m_strings.item(index).value};
auto data = StringData::create(str);
data->refcount |= interned_flag;
- m_strings.insert({data->strview(), data.get()});
+ m_strings.insert({data->strview(), data.get()}, hash);
return data;
}
+StringDataPtr StringData::Registry::intern(StringView str)
+{
+ return intern(str, hash_value(str));
+}
+
void StringData::Registry::remove(StringView str)
{
kak_assert(m_strings.contains(str));