On Tue, Apr 02, 2024 at 01:43:48PM -0400, Tom Lane wrote: > Alvaro Herrera <alvhe...@alvh.no-ip.org> writes: >> On 2024-Apr-02, Nathan Bossart wrote: >>> Another idea I had is to turn pg_popcount() into a macro that just uses the >>> pg_number_of_ones array when called for few bytes: >>> >>> static inline uint64 >>> pg_popcount_inline(const char *buf, int bytes) >>> { >>> uint64 popcnt = 0; >>> >>> while (bytes--) >>> popcnt += pg_number_of_ones[(unsigned char) *buf++]; >>> >>> return popcnt; >>> } >>> >>> #define pg_popcount(buf, bytes) \ >>> ((bytes < 64) ? \ >>> pg_popcount_inline(buf, bytes) : \ >>> pg_popcount_optimized(buf, bytes)) >>> >>> But again, I'm not sure this is really worth it for the current use-cases. > >> Eh, that seems simple enough, and then you can forget about that case. > > I don't like the double evaluation of the macro argument. Seems like > you could get the same results more safely with > > static inline uint64 > pg_popcount(const char *buf, int bytes) > { > if (bytes < 64) > { > uint64 popcnt = 0; > > while (bytes--) > popcnt += pg_number_of_ones[(unsigned char) > *buf++]; > > return popcnt; > } > return pg_popcount_optimized(buf, bytes); > }
Yeah, I like that better. I'll do some testing to see what the threshold really should be before posting an actual patch. -- Nathan Bossart Amazon Web Services: https://aws.amazon.com