From b226898acc15c329cf73308ff9d77f0a15f08322 Mon Sep 17 00:00:00 2001 From: Ants Aasma Date: Mon, 29 Jan 2024 15:16:02 +0200 Subject: [PATCH 1/2] Speed up last iteration of aligned fasthash We know the length of the string so we can mask out end of the string with a shift. Without this the aligned version was slower than unaligned on small strings. --- src/include/common/hashfn_unstable.h | 31 ++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/src/include/common/hashfn_unstable.h b/src/include/common/hashfn_unstable.h index 3d927e1fb18..8ee1b99a204 100644 --- a/src/include/common/hashfn_unstable.h +++ b/src/include/common/hashfn_unstable.h @@ -176,6 +176,19 @@ fasthash_accum(fasthash_state *hs, const char *k, int len) #define haszero64(v) \ (((v) - 0x0101010101010101) & ~(v) & 0x8080808080808080) +/* + * Returns non-zero when first byte in memory order is not NUL + */ +static inline int +first_byte_nonzero(uint64 v) +{ +#ifdef WORDS_BIGENDIAN + return v >> 56; +#else + return v & 0xFF; +#endif +} + /* * all-purpose workhorse for fasthash_accum_cstring */ @@ -211,11 +224,12 @@ fasthash_accum_cstring_aligned(fasthash_state *hs, const char *str) const char *const start = str; int remainder; uint64 zero_bytes_le; + uint64 chunk; Assert(PointerIsAligned(start, uint64)); for (;;) { - uint64 chunk = *(uint64 *) str; + chunk = *(uint64 *) str; /* * With little-endian representation, we can use this calculation, @@ -243,9 +257,18 @@ fasthash_accum_cstring_aligned(fasthash_state *hs, const char *str) * byte within the input word by counting the number of trailing (because * little-endian) zeros and dividing the result by 8. */ - remainder = pg_rightmost_one_pos64(zero_bytes_le) / BITS_PER_BYTE; - fasthash_accum(hs, str, remainder); - str += remainder; + if (first_byte_nonzero(chunk)) + { + remainder = pg_rightmost_one_pos64(zero_bytes_le) / BITS_PER_BYTE; +#ifdef WORDS_BIGENDIAN + hs->accum = chunk & ((~0ULL) << (64 - BITS_PER_BYTE*remainder)); +#else + hs->accum = chunk & ((~0ULL) >> (64 - BITS_PER_BYTE*remainder)); +#endif + fasthash_combine(hs); + + str += remainder; + } return str - start; } -- 2.34.1