From 3a2bee493bb30f3c2f253ab27a715d3ca1262111 Mon Sep 17 00:00:00 2001 From: John Naylor Date: Tue, 26 Dec 2023 12:18:22 +0700 Subject: [PATCH v11 7/8] Add bench for pgstat --- contrib/bench_hash/bench_hash--1.0.sql | 9 ++++ contrib/bench_hash/bench_hash.c | 66 ++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/contrib/bench_hash/bench_hash--1.0.sql b/contrib/bench_hash/bench_hash--1.0.sql index b3a5747432..43ce946bf6 100644 --- a/contrib/bench_hash/bench_hash--1.0.sql +++ b/contrib/bench_hash/bench_hash--1.0.sql @@ -19,3 +19,12 @@ RETURNS int AS 'MODULE_PATHNAME' LANGUAGE C STRICT; +CREATE FUNCTION bench_pgstat_hash(int4) +RETURNS int +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT; + +CREATE FUNCTION bench_pgstat_hash_FH(int4) +RETURNS int +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT; diff --git a/contrib/bench_hash/bench_hash.c b/contrib/bench_hash/bench_hash.c index 9c9dba93f0..017cf333ce 100644 --- a/contrib/bench_hash/bench_hash.c +++ b/contrib/bench_hash/bench_hash.c @@ -21,6 +21,7 @@ PG_MODULE_MAGIC; #include "common/hashfn_unstable.h" #include "miscadmin.h" #include "utils/memutils.h" +#include "utils/pgstat_internal.h" PG_FUNCTION_INFO_V1(bench_string_hash); @@ -101,3 +102,68 @@ bench_cstring_hash_aligned(PG_FUNCTION_ARGS) PG_RETURN_INT32(hash); } + +static inline uint32 +pgstat_hash_hash_key_orig(const void *d, size_t size, void *arg) +{ + const PgStat_HashKey *key = (PgStat_HashKey *) d; + uint32 hash; + + Assert(size == sizeof(PgStat_HashKey) && arg == NULL); + + hash = murmurhash32(key->kind); + hash = hash_combine(hash, murmurhash32(key->dboid)); + hash = hash_combine(hash, murmurhash32(key->objoid)); + + return hash; +} + +static inline uint32 +pgstat_hash_hash_key_FH(const void *d, size_t size, void *arg) +{ + const PgStat_HashKey *key = (PgStat_HashKey *) d; + + Assert(size == sizeof(PgStat_HashKey) && arg == NULL); + + return fasthash32((const char *) key, size, 0); +} + +PG_FUNCTION_INFO_V1(bench_pgstat_hash); +Datum +bench_pgstat_hash(PG_FUNCTION_ARGS) +{ + int32 count = PG_GETARG_INT32(0); + uint32 hash = 0; + + while (count-- > 0) + { + for (int i=0; i< SCANKEYWORDS_NUM_KEYWORDS - 3; i++) + { + int idx = word_offsets[i]; + hash += pgstat_hash_hash_key_orig((const void *) &aligned_words[idx], sizeof(PgStat_HashKey), NULL); + } + CHECK_FOR_INTERRUPTS(); + } + + PG_RETURN_INT32(hash); +} + +PG_FUNCTION_INFO_V1(bench_pgstat_hash_fh); +Datum +bench_pgstat_hash_fh(PG_FUNCTION_ARGS) +{ + int32 count = PG_GETARG_INT32(0); + uint32 hash = 0; + + while (count-- > 0) + { + for (int i=0; i< SCANKEYWORDS_NUM_KEYWORDS - 3; i++) + { + int idx = word_offsets[i]; + hash += pgstat_hash_hash_key_FH((const void *) &aligned_words[idx], sizeof(PgStat_HashKey), NULL); + } + CHECK_FOR_INTERRUPTS(); + } + + PG_RETURN_INT32(hash); +} -- 2.43.0