diff options
| author | Maxime Coste <mawww@kakoune.org> | 2023-11-17 17:01:51 +1100 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2023-11-17 17:01:51 +1100 |
| commit | 296ab1a1ffb707f4691cdce21172b3b8d0b48eb0 (patch) | |
| tree | 6388c07b53a5cfda953b92c058a819684bcec67f /src/shared_string.cc | |
| parent | b10a935b8ceb18f256bd04843a5442d7c746abdb (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.cc | 16 |
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)); |
