LibRegex: Avoid hashing the state hashes again
Some checks are pending
CI / Lagom (arm64, Sanitizer_CI, false, macos-15, macOS, Clang) (push) Waiting to run
CI / Lagom (x86_64, Fuzzers_CI, false, ubuntu-24.04, Linux, Clang) (push) Waiting to run
CI / Lagom (x86_64, Sanitizer_CI, false, ubuntu-24.04, Linux, GNU) (push) Waiting to run
CI / Lagom (x86_64, Sanitizer_CI, true, ubuntu-24.04, Linux, Clang) (push) Waiting to run
Package the js repl as a binary artifact / build-and-package (arm64, macos-15, macOS, macOS-universal2) (push) Waiting to run
Package the js repl as a binary artifact / build-and-package (x86_64, ubuntu-24.04, Linux, Linux-x86_64) (push) Waiting to run
Run test262 and test-wasm / run_and_update_results (push) Waiting to run
Lint Code / lint (push) Waiting to run
Label PRs with merge conflicts / auto-labeler (push) Waiting to run
Push notes / build (push) Waiting to run

We already had a really nice hash that had a single issue, this commit
fixes that and makes it *the* hash for the hash table, so we avoid
double-hashing and making a long chain.
This is an easy 10% perf gain.
This commit is contained in:
Ali Mohammad Pur 2025-04-18 12:28:45 +02:00 committed by Andreas Kling
commit 3b4a184f1a
Notes: github-actions[bot] 2025-04-18 15:10:24 +00:00
2 changed files with 12 additions and 4 deletions

View file

@ -467,11 +467,18 @@ private:
Node* m_last { nullptr };
};
struct SufficientlyUniformValueTraits : DefaultTraits<u64> {
static constexpr unsigned hash(u64 value)
{
return (value >> 32) ^ value;
}
};
template<class Parser>
bool Matcher<Parser>::execute(MatchInput const& input, MatchState& state, size_t& operations) const
{
BumpAllocatedLinkedList<MatchState> states_to_try_next;
HashTable<u64> seen_state_hashes;
HashTable<u64, SufficientlyUniformValueTraits> seen_state_hashes;
#if REGEX_DEBUG
size_t recursion_level = 0;
#endif