Re: A qsort template
Thomas Munro <thomas.munro@gmail.com>
From: Thomas Munro <thomas.munro@gmail.com>
To: John Naylor <john.naylor@enterprisedb.com>
Cc: pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2021-07-04T04:27:21Z
Lists: pgsql-hackers
Attachments
On Fri, Jul 2, 2021 at 2:32 PM John Naylor <john.naylor@enterprisedb.com> wrote: > I suspect if we experiment on two extremes of type "heaviness" (accessing and comparing trivial or not), such as uint32 and tuplesort, we'll have a pretty good idea what the parameters should be, if anything different. I'll do some testing along those lines. Cool. Since you are experimenting with tuplesort and likely thinking similar thoughts, here's a patch I've been using to explore that area. I've seen it get, for example, ~1.18x speedup for simple index builds in favourable winds (YMMV, early hacking results only). Currently, it kicks in when the leading column is of type int4, int8, timestamp, timestamptz, date or text + friends (when abbreviatable, currently that means "C" and ICU collations only), while increasing the executable by only 8.5kB (Clang, amd64, -O2, no debug). These types are handled with just three specialisations. Their custom "fast" comparators all boiled down to comparisons of datum bits, varying only in signedness and width, so I tried throwing them away and using 3 new common routines. Then I extended tuplesort_sort_memtuples()'s pre-existing specialisation dispatch to recognise qualifying users of those and select 3 corresponding sort specialisations. It might turn out to be worth burning some more executable size on extra variants (for example, see XXX notes in the code comments for opportunities; one could also go nuts trying smaller things like special cases for not-null, nulls first, reverse sort, ... to kill all those branches), or not.
Commits
-
Remove debug messages from tuplesort_sort_memtuples()
- 6e647ef0e750 15.0 landed
-
Fix performance regression in tuplesort specializations
- 99c754129d78 15.0 landed
-
Fix tuplesort optimization for CLUSTER-on-expression.
- cc58eecc5d75 15.0 landed
-
Initial pgindent and pgperltidy run for v14.
- def5b065ff22 14.0 cited
-
Specialize checkpointer sort functions.
- 1b88b8908e75 14.0 landed
-
Use sort_template.h for qsort() and qsort_arg().
- f374f4d66425 14.0 landed
-
Use sort_template.h for qsort_tuple() and qsort_ssup().
- 8eda3eba3063 14.0 landed
-
Add sort_template.h for making sort functions.
- 0a1f1d3cac6b 14.0 landed
-
Use abbreviated keys for faster sorting of text datums.
- 4ea51cdfe85c 9.5.0 cited