Re: Change GUC hashtable to use simplehash?
John Naylor <johncnaylorls@gmail.com>
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Silence warning in older versions of Valgrind
- fde7c0164ea2 17.5 landed
- 0600d276d485 18.0 landed
-
Revert "Speed up tail processing when hashing aligned C strings, take two"
- 6555fe197914 17.3 landed
- 235328ee4ae4 18.0 landed
-
Speed up tail processing when hashing aligned C strings, take two
- a365d9e2e8c1 17.0 landed
-
Teach fasthash_accum to use platform endianness for bytewise loads
- 0c25fee35903 17.0 landed
-
Add macro to disable address safety instrumentation
- db17594ad73a 17.0 landed
-
Convert uses of hash_string_pointer to fasthash equivalent
- f956ecd0353b 17.0 landed
-
Speed up tail processing when hashing aligned C strings
- 07f0f6abfc7f 17.0 landed
-
Add helper functions for dshash tables with string keys.
- 42a1de3013ea 17.0 cited
-
Fix warnings in cpluspluscheck
- 257998508672 17.0 landed
-
Further cosmetic review of hashfn_unstable.h
- b83033c3cff5 17.0 landed
-
Simplify initialization of incremental hash state
- 9ed3ee5001b6 17.0 landed
-
Add optimized C string hashing
- 0aba2554409e 17.0 landed
-
Add inline incremental hash functions for in-memory use
- e97b672c88f6 17.0 landed
-
Make all Perl warnings fatal
- c5385929593d 17.0 cited
Attachments
- v7-0011-Add-abiliy-to-case-fold-with-chunk-8-byte-interfa.patch (text/x-patch) patch v7-0011
- v7-0012-Use-chunk-interface-for-guc_name_hash.patch (text/x-patch) patch v7-0012
- v7-0013-PoC-Get-rid-of-strlen-calls-when-using-HASH_STRIN.patch (text/x-patch) patch v7-0013
- v7-0009-Convert-GUC-hashtable-to-use-simplehash.patch (text/x-patch) patch v7-0009
- v7-0010-Use-inline-equality-function-for-guc-hash.patch (text/x-patch) patch v7-0010
- v7-0006-Add-bytewise-interface.patch (text/x-patch) patch v7-0006
- v7-0005-Demonstrate-fasthash32-with-pgstat_hash_hash_key.patch (text/x-patch) patch v7-0005
- v7-0008-Casefold-lazily-in-guc_name_compare.patch (text/x-patch) patch v7-0008
- v7-0007-Use-bytewise-fasthash-in-guc_name_hash.patch (text/x-patch) patch v7-0007
- v7-0004-Assert-that-the-incremental-fasthash-variants-giv.patch (text/x-patch) patch v7-0004
- v7-0003-Add-UINT64CONST-not-sure-when-we-actually-need-th.patch (text/x-patch) patch v7-0003
- v7-0002-Rewrite-fasthash-functions-using-a-homegrown-incr.patch (text/x-patch) patch v7-0002
- v7-0001-Vendor-fasthash.patch (text/x-patch) patch v7-0001
On Sun, Dec 10, 2023 at 2:18 AM Jeff Davis <pgsql@j-davis.com> wrote:
>
> On Sat, 2023-12-09 at 18:52 +0700, John Naylor wrote:
> > > I tested using the new hash function APIs for my search path cache,
> > > and
> > > there's a significant speedup for cases not benefiting from
> > > a86c61c9ee.
> > > It's enough that we almost don't need a86c61c9ee. So a definite +1
> > > to
> > > the new APIs.
Interesting, thanks for testing! SearchPathCache is a better starting
point than dynahash for removing strlen calls anyway -- it's more
localized, uses simplehash, and we can test it with at-hand tests.
> > Do you have a new test?
>
> Still using the same basic test here:
>
> https://www.postgresql.org/message-id/04c8592dbd694e4114a3ed87139a7a04e4363030.camel%40j-davis.com
>
> What I did is:
>
> a. add your v5 patches
> b. disable optimization in a86c61c9ee
> c. add attached patch to use new hash APIs
Of course, the CF bot doesn't know this, so it crashed and burned
before I had a chance to check how v6 did. I'm attaching v7 which just
improves commit messages for reviewing, and gets rid of git whitespace
errors.
My local branch of master is still at 457428d9e99b6 from Dec 4. That's
before both a86c61c9ee (Optimize SearchPathCache by saving the last
entry.) and 867dd2dc87 (Cache opaque handle for GUC option to avoid
repeasted lookups.). My plan was to keep testing against Dec. 4, but
like you I'm not sure if there is a better GUC test to do now.
> I got a slowdown between (a) and (b), and then (c) closed the gap about
> halfway. It started to get close to test noise at that point -- I could
> get some better numbers out of it if it's helpful.
We can also try (c) with using the "chunked" interface. Also note your
patch may no longer apply on top of v6 or v7.
> Also, what I'm doing in the attached path is using part of the key as
> the seed. Is that a good idea or should the seed be zero or come from
> somewhere else?
I think whether to use part of the key as a seed is a judgment call.
See this part in resowner.c:
/*
* Most resource kinds store a pointer in 'value', and pointers are unique
* all on their own. But some resources store plain integers (Files and
* Buffers as of this writing), so we want to incorporate the 'kind' in
* the hash too, otherwise those resources will collide a lot. But
* because there are only a few resource kinds like that - and only a few
* resource kinds to begin with - we don't need to work too hard to mix
* 'kind' into the hash. Just add it with hash_combine(), it perturbs the
* result enough for our purposes.
*/
#if SIZEOF_DATUM == 8
return hash_combine64(murmurhash64((uint64) value), (uint64) kind);
Given these comments, I'd feel free to use the "kind" as the seed if I
were writing this with fasthash.
The caller-provided seed can probably be zero unless we have a good
reason to, like the above, but with the incremental interface there is
an issue:
hs->hash = seed ^ (len * UINT64CONST(0x880355f21e6d1965));
Passing length 0 will wipe out the internal seed here, and that can't be good.
1) We could by convention pass "1" as the length for strings. That
could be a macro like
#define FH_UNKNOWN_LENGTH 1
...and maybe Assert(len != 0 || seed != 0)
Or 2) we could detect zero and force it to be one, but it's best if
the compiler can always constant-fold that branch. Future work may
invalidate that assumption.