Re: plpgsql function startup-time improvements - Mailing list pgsql-hackers

From Tels
Subject Re: plpgsql function startup-time improvements
Date
Msg-id 351733fb167ebbe15b5ff67292b720d8.squirrel@sm.webmail.pair.com
Whole thread Raw
In response to Re: plpgsql function startup-time improvements  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: plpgsql function startup-time improvements
List pgsql-hackers
Moin,

On Thu, December 28, 2017 5:43 pm, Tom Lane wrote:
> "Tels" <nospam-pg-abuse@bloodgate.com> writes:
>> On Wed, December 27, 2017 3:38 pm, Tom Lane wrote:
>>> Also, I changed PLpgSQL_var.isconst and PLpgSQL_var.notnull from "int"
>>> to "bool", which is what they should have been all along, and relocated
>>> them in the PLpgSQL_var struct.
>
>> With a short test program printing out the size of PLpgSQL_var to check,
>> I
>> always saw 72 bytes, regardless of bool vs. int. So a bool would be 4
>> bytes here. Hmm.
>
> Seems fairly unlikely, especially given that we typedef bool as char ;-).

Hmn, yes, I can see my confusion. And a test shows, that sizeof(bool) is 1
here. and *char etc are 8.

> Which field order were you checking?  Are you accounting for alignment
> padding?
>
> By my count, with the existing field order on typical 64-bit hardware,
> we ought to have
>
>     PLpgSQL_datum_type dtype;       -- 4 bytes [1]
>     int         dno;                -- 4 bytes
>     char       *refname;            -- 8 bytes
>     int         lineno;             -- 4 bytes
>                                     -- 4 bytes wasted due to padding here
>     PLpgSQL_type *datatype;         -- 8 bytes
>     int         isconst;            -- 4 bytes
>     int         notnull;            -- 4 bytes
>     PLpgSQL_expr *default_val;      -- 8 bytes
>     PLpgSQL_expr *cursor_explicit_expr;     -- 8 bytes
>     int         cursor_explicit_argrow;     -- 4 bytes
>     int         cursor_options;             -- 4 bytes
>
>     Datum       value;              -- 8 bytes
>     bool        isnull;             -- 1 byte
>     bool        freeval;            -- 1 byte
>
> so at this point we've consumed 74 bytes, but the whole struct has
> to be aligned on 8-byte boundaries because of the pointers, so
> sizeof(PLpgSQL_var) ought to be 80 --- and that is what I see here.
>
> With the proposed redesign,
>
>     PLpgSQL_datum_type dtype;       -- 4 bytes [1]
>     int         dno;                -- 4 bytes
>     char       *refname;            -- 8 bytes
>     int         lineno;             -- 4 bytes
>
>     bool        isconst;            -- 1 byte
>     bool        notnull;            -- 1 byte
>                                     -- 2 bytes wasted due to padding here
>     PLpgSQL_type *datatype;         -- 8 bytes
>     PLpgSQL_expr *default_val;      -- 8 bytes
>     PLpgSQL_expr *cursor_explicit_expr;     -- 8 bytes
>     int         cursor_explicit_argrow;     -- 4 bytes
>     int         cursor_options;             -- 4 bytes
>
>     Datum       value;              -- 8 bytes
>     bool        isnull;             -- 1 byte
>     bool        freeval;            -- 1 byte
>
> so we've consumed 66 bytes, which rounds up to 72 with the addition
> of trailing padding.

Sounds logical, thanx for the detailed explanation. In my test the first 4
padding bytes are probably not there, because I probably miss something
that aligns ptrs on 8-byte boundaries. At least that would explain the
sizes seen here.

So, if you moved "isnull" and "freeval" right behind "isconst" and
"notnull", you could save another 2 byte, land at 64, and thus no extra
padding would keep it at 64?

>> And maybe folding all four bool fields into an "int flags" field with
>> bits
>> would save space, and not much slower (depending on often how the
>> different flags are accessed due to the ANDing and ORing ops)?
>
> That'd be pretty messy/invasive in terms of the code changes needed,
> and I don't think it'd save any space once you account for alignment
> and the fact that my other patch proposes to add another enum at
> the end of the struct.  Also, I'm not exactly convinced that
> replacing byte sets and tests with bitflag operations would be
> cheap time-wise.  (It would particularly be a mess for isnull,
> since then there'd be an impedance mismatch with a whole lotta PG
> APIs that expect null flags to be bools.)

Already had a hunch the idea wouldn't be popular, and this are all pretty
solid arguments against it. Nevermind, then :)

Best wishes,

Tels


pgsql-hackers by date:

Previous
From: Alvaro Herrera
Date:
Subject: Re: [HACKERS] taking stdbool.h into use
Next
From: Alvaro Herrera
Date:
Subject: Re: [HACKERS] path toward faster partition pruning