mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-08-09 01:29:17 +00:00
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
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:
parent
446a453719
commit
3b4a184f1a
Notes:
github-actions[bot]
2025-04-18 15:10:24 +00:00
Author: https://github.com/alimpfard
Commit: 3b4a184f1a
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/4375
2 changed files with 12 additions and 4 deletions
|
@ -418,7 +418,8 @@ struct MatchState {
|
||||||
auto combine = [&hash](auto value) {
|
auto combine = [&hash](auto value) {
|
||||||
hash ^= value + 0x9e3779b97f4a7c15 + (hash << 6) + (hash >> 2);
|
hash ^= value + 0x9e3779b97f4a7c15 + (hash << 6) + (hash >> 2);
|
||||||
};
|
};
|
||||||
auto combine_vector = [&hash](auto const& vector) {
|
auto combine_vector = [&hash](auto const& vector, auto tag) {
|
||||||
|
hash ^= tag * (vector.size() + 1);
|
||||||
for (auto& value : vector) {
|
for (auto& value : vector) {
|
||||||
hash ^= value;
|
hash ^= value;
|
||||||
hash *= 0x100000001b3;
|
hash *= 0x100000001b3;
|
||||||
|
@ -431,8 +432,8 @@ struct MatchState {
|
||||||
combine(instruction_position);
|
combine(instruction_position);
|
||||||
combine(fork_at_position);
|
combine(fork_at_position);
|
||||||
combine(initiating_fork.value_or(0) + initiating_fork.has_value());
|
combine(initiating_fork.value_or(0) + initiating_fork.has_value());
|
||||||
combine_vector(repetition_marks);
|
combine_vector(repetition_marks, 0xbeefbeefbeefbeef);
|
||||||
combine_vector(checkpoints);
|
combine_vector(checkpoints, 0xfacefacefaceface);
|
||||||
|
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
|
@ -467,11 +467,18 @@ private:
|
||||||
Node* m_last { nullptr };
|
Node* m_last { nullptr };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct SufficientlyUniformValueTraits : DefaultTraits<u64> {
|
||||||
|
static constexpr unsigned hash(u64 value)
|
||||||
|
{
|
||||||
|
return (value >> 32) ^ value;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
template<class Parser>
|
template<class Parser>
|
||||||
bool Matcher<Parser>::execute(MatchInput const& input, MatchState& state, size_t& operations) const
|
bool Matcher<Parser>::execute(MatchInput const& input, MatchState& state, size_t& operations) const
|
||||||
{
|
{
|
||||||
BumpAllocatedLinkedList<MatchState> states_to_try_next;
|
BumpAllocatedLinkedList<MatchState> states_to_try_next;
|
||||||
HashTable<u64> seen_state_hashes;
|
HashTable<u64, SufficientlyUniformValueTraits> seen_state_hashes;
|
||||||
#if REGEX_DEBUG
|
#if REGEX_DEBUG
|
||||||
size_t recursion_level = 0;
|
size_t recursion_level = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue