On 2018-10-16 10:16:33 -0400, Tom Lane wrote: > Andres Freund <and...@anarazel.de> writes: > > On 2018-10-16 01:59:00 -0400, Tom Lane wrote: > >> Also, I noticed that the biggest part of those structs are arrays of > >> FormatNode, which has been designed with complete lack of thought about > >> size or padding issues. We can very easily cut it in half on 64-bit > >> machines. > > > Heh, neat. I feel like we've paid very little attention to that in a > > myriad of places :( > > Most of the time, we probably *shouldn't* pay attention to it; logical > field ordering is worth a good deal IMO.
Sure. But there's plenty structs which we allocate a bunch off, that are frequently accessed, where a lot of space is wasted to padding. I agree that we don't need to contort many structs, but there's plenty where we should. Often enough it's possible to reorder without making things make meaningfully less sense. > But in a case like this, > where there are large arrays of the things and it's not very painful > to avoid padding waste, it's worth the trouble. Attached is a patch that shrinks fmgr_builtins by 25%. That seems worthwhile, it's pretty frequently accessed, making it more dense is helpful. Unless somebody protests soon, I'm going to apply that... Greetings, Andres Freund
>From 575a51d94fd4bef6914ba55b33ba96504f64d574 Mon Sep 17 00:00:00 2001 From: Andres Freund <and...@anarazel.de> Date: Tue, 16 Oct 2018 13:05:52 -0700 Subject: [PATCH] Reorder FmgrBuiltin members, saving 25% in size. That's worth it, as fmgr_builtins is frequently accessed, and as fmgr_builtins is one of the biggest constant variables in a backend. --- src/backend/utils/Gen_fmgrtab.pl | 2 +- src/include/utils/fmgrtab.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/utils/Gen_fmgrtab.pl b/src/backend/utils/Gen_fmgrtab.pl index fa30436895b..ca282913552 100644 --- a/src/backend/utils/Gen_fmgrtab.pl +++ b/src/backend/utils/Gen_fmgrtab.pl @@ -230,7 +230,7 @@ my $fmgr_count = 0; foreach my $s (sort { $a->{oid} <=> $b->{oid} } @fmgr) { print $tfh - " { $s->{oid}, \"$s->{prosrc}\", $s->{nargs}, $bmap{$s->{strict}}, $bmap{$s->{retset}}, $s->{prosrc} }"; + " { $s->{oid}, $s->{nargs}, $bmap{$s->{strict}}, $bmap{$s->{retset}}, \"$s->{prosrc}\", $s->{prosrc} }"; $fmgr_builtin_oid_index[ $s->{oid} ] = $fmgr_count++; diff --git a/src/include/utils/fmgrtab.h b/src/include/utils/fmgrtab.h index d8317eb3eac..8d89d66777b 100644 --- a/src/include/utils/fmgrtab.h +++ b/src/include/utils/fmgrtab.h @@ -25,10 +25,10 @@ typedef struct { Oid foid; /* OID of the function */ - const char *funcName; /* C name of the function */ short nargs; /* 0..FUNC_MAX_ARGS, or -1 if variable count */ bool strict; /* T if function is "strict" */ bool retset; /* T if function returns a set */ + const char * const funcName; /* C name of the function */ PGFunction func; /* pointer to compiled function */ } FmgrBuiltin; -- 2.18.0.rc2.dirty