agora inbox for pgsql-hackers@postgresql.org
help / color / mirror / Atom feedFrom: Nathan Bossart <nathandbossart@gmail.com>
To: Sehrope Sarkuni <sehrope@jackdb.com>
Cc: Pg Hackers <pgsql-hackers@postgresql.org>
Subject: Re: Speed up lpad() and rpad() for one-byte padding strings
Date: Wed, 23 Sep 2026 12:09:08 -0500
Message-ID: <arQHtMApsI6MX-XH@nathan> (raw)
In-Reply-To: <arPlICNzFXv6zTbS@nathan>
References: <CAH7T-apj+pFg9bRkXVGfGejS2Uu4WzdMd7KoLKTW11mdsrt1Ew@mail.gmail.com>
<arPlICNzFXv6zTbS@nathan>
On Wed, Sep 23, 2026 at 09:41:36AM -0500, Nathan Bossart wrote:
> On Wed, Sep 23, 2026 at 10:10:09AM -0400, Sehrope Sarkuni wrote:
>> lpad() and rpad() pad one character at a time, calling
>> pg_mblen_range() and memcpy() once per padding char. When the padding
>> string is a single byte, e.g., lpad(x, n, '0') or rpad(x, n, ' '),
>> the padding is that byte repeated, so the attached patch fills it with
>> one memset().
>
> I wonder if we could expand these gains by using SIMD whenever the vector
> length is divisible by the padding string length. My hunch is that's where
> a lot of the memset() gains come from.
Actually, I think we can expand this to any padding string length by
copying the padding string once, and then copying from the beginning of the
padding to the end repeatedly so that we write double the padding each
time. This is a bit like what commit c60e520 added for pglz_decompress().
I've attached some proof-of-concept grade patches. This doesn't quite
match the performance of your 1-byte fast-path, but it's pretty close and
applies to many more cases.
--
nathan
Attachments:
[text/plain] v2-0001-Factor-the-padding-loop-out-of-lpad-and-rpad.patch (0B, ../arQHtMApsI6MX-XH@nathan/2-v2-0001-Factor-the-padding-loop-out-of-lpad-and-rpad.patch)
download
view thread (7+ messages) latest in thread
Message-ID: <arQHtMApsI6MX-XH@nathan>
Permalink: ../arQHtMApsI6MX-XH@nathan/
Also on: postgresql.org/message-id/arQHtMApsI6MX-XH@nathan
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-hackers@postgresql.org
Cc: nathandbossart@gmail.com, sehrope@jackdb.com
Subject: Re: Speed up lpad() and rpad() for one-byte padding strings
In-Reply-To: <arQHtMApsI6MX-XH@nathan>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox