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
- v11-0005-Add-benchmark-for-hashing-C-strings.patch (application/x-patch) patch v11-0005
- v11-0004-Add-optimized-string-hashing-to-hashfn_unstable..patch (application/x-patch) patch v11-0004
- v11-0007-Add-bench-for-pgstat.patch (application/x-patch) patch v11-0007
- v11-0008-Optimize-loading-tail-when-4-bytes.patch (application/x-patch) patch v11-0008
- v11-0006-Try-simply-byte-swapping-on-BE-machines-and-then.patch (application/x-patch) patch v11-0006
- v11-0001-Add-inlineable-incremental-hash-functions-for-in.patch (application/x-patch) patch v11-0001
- v11-0003-Use-fasthash-for-the-search-path-cache.patch (application/x-patch) patch v11-0003
- v11-0002-Use-fasthash-for-pgstat_hash_hash_key.patch (application/x-patch) patch v11-0002
On Wed, Dec 20, 2023 at 1:48 PM John Naylor <johncnaylorls@gmail.com> wrote: > > On Wed, Dec 20, 2023 at 3:23 AM Jeff Davis <pgsql@j-davis.com> wrote: > > > > The reason I looked here is that the inner while statement (to find the > > chunk size) looked out of place and possibly slow, and there's a > > bitwise trick we can use instead. > > There are other bit tricks we can use. In v11-0005 Just for fun, I > translated a couple more into C from > > https://github.com/openbsd/src/blob/master/lib/libc/arch/amd64/string/strlen.S I wanted to see if this gets us anything so ran a couple microbenchmarks. 0001-0003 are same as earlier 0004 takes Jeff's idea and adds in an optimization from NetBSD's strlen (I said OpenBSD earlier, but it goes back further). I added stub code to simulate big-endian when requested at compile time, but a later patch removes it. Since it benched well, I made the extra effort to generalize it for other callers. After adding to the hash state, it returns the length so the caller can pass it to the finalizer. 0005 is the benchmark (not for commit) -- I took the parser keyword list and added enough padding to make every string aligned when the whole thing is copied to an alloc'd area. Each of the bench_*.sql files named below are just running the similarly-named function, all with the same argument, e.g. "select * from bench_pgstat_hash_fh(100000);", so not attached. Strings: -- strlen + hash_bytes pgbench -n -T 20 -f bench_hash_bytes.sql -M prepared | grep latency latency average = 1036.732 ms -- word-at-a-time hashing, with bytewise lookahead pgbench -n -T 20 -f bench_cstr_unaligned.sql -M prepared | grep latency latency average = 664.632 ms -- word-at-a-time for both hashing and lookahead (Jeff's aligned coding plus a technique from NetBSD strlen) pgbench -n -T 20 -f bench_cstr_aligned.sql -M prepared | grep latency latency average = 436.701 ms So, the fully optimized aligned case is worth it if it's convenient. 0006 adds a byteswap for big-endian so we can reuse little endian coding for the lookahead. 0007 - I also wanted to put numbers to 0003 (pgstat hash). While the motivation for that was cleanup, I had a hunch it would shave cycles and take up less binary space. It does on both accounts: -- 3x murmur + hash_combine pgbench -n -T 20 -f bench_pgstat_orig.sql -M prepared | grep latency latency average = 333.540 ms -- fasthash32 (simple call, no state setup and final needed for a single value) pgbench -n -T 20 -f bench_pgstat_fh.sql -M prepared | grep latency latency average = 277.591 ms 0008 - We can optimize the tail load when it's 4 bytes -- to save loads, shifts, and OR's. My compiler can't figure this out for the pgstat hash, with its fixed 4-byte tail. It's pretty simple and should help other cases: pgbench -n -T 20 -f bench_pgstat_fh.sql -M prepared | grep latency latency average = 226.113 ms