On Mon, Nov 20, 2023 at 5:54 AM Jeff Davis <pg...@j-davis.com> wrote: > > Attached are a bunch of tiny patches and some perf numbers based on > simple test described here: > > https://www.postgresql.org/message-id/04c8592dbd694e4114a3ed87139a7a04e4363030.camel%40j-davis.com
I tried taking I/O out, like this, thinking the times would be less variable: cat bench.sql select 1 from generate_series(1,500000) x(x), lateral (SELECT inc_ab(x)) a offset 10000000; (with turbo off) pgbench -n -T 30 -f bench.sql -M prepared master: latency average = 643.625 ms 0001-0005: latency average = 607.354 ms ...about 5.5% less time, similar to what Jeff found. I get a noticeable regression in 0002, though, and I think I see why: guc_name_hash(const char *name) { - uint32 result = 0; + const unsigned char *bytes = (const unsigned char *)name; + int blen = strlen(name); The strlen call required for hashbytes() is not free. The lack of mixing in the (probably inlined after 0001) previous hash function can remedied directly, as in the attached: 0001-0002 only: latency average = 670.059 ms 0001-0002, plus revert hashbytes, add finalizer: latency average = 656.810 ms -#define SH_EQUAL(tb, a, b) (guc_name_compare(a, b) == 0) +#define SH_EQUAL(tb, a, b) (strcmp(a, b) == 0) Likewise, I suspect calling out to the C library is going to throw away some of the gains that were won by not needing to downcase all the time, but I haven't dug deeper.
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index b51d10dbc0..124b8fbe85 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -1363,10 +1363,17 @@ guc_name_compare(const char *namea, const char *nameb) static uint32 guc_name_hash(const char *name) { - const unsigned char *bytes = (const unsigned char *)name; - int blen = strlen(name); + uint32 result = 0; - return hash_bytes(bytes, blen); + while (*name) + { + char ch = *name++; + + /* Merge into hash ... not very bright, but it needn't be */ + result = pg_rotate_left32(result, 5); + result ^= (uint32) ch; + } + return murmurhash32(result); } /*