Re: Large writable variables

Andres Freund <andres@anarazel.de>

From: Andres Freund <andres@anarazel.de>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: pgsql-hackers@postgresql.org, Thomas Munro <thomas.munro@enterprisedb.com>
Date: 2018-10-16T20:59:06Z
Lists: pgsql-hackers
On 2018-10-16 16:36:12 -0400, Tom Lane wrote:
> Andres Freund <andres@anarazel.de> writes:
> > 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...
> 
> Hah.  I'm pretty sure that struct *was* set up with an eye to padding ...
> on 32-bit machines.

Possible, the new layout should work just as well there, luckily.


> This does make it shorter on 64-bit, but also
> makes the size not a power of 2, which might add a few cycles to
> array indexing calculations.  Might be worth checking whether that's
> going to be an issue anywhere.

I can't imagine that that outweight the cost of additional cache misses
on any platform where performance matters.  On x86 I assume indexing
into an array with 24byte stride, will normally be just two leas (lea
eax, [eax + eax * 2]; lea eax, [ebx + eax * 8]; where eax initially is
the index, and ebx the array base).  Indexing also plays less of a role
than in the past, because previously we did a binary search, but now we
normally look up the index via fmgr_builtin_oid_index.


> What's the point of the extra const decoration on funcName?  ISTM
> the whole struct should be const, or not.

The whole array is const.  There's cases where that allows the compiler
more freedom - but I guess it's really a bit redundant here.

Greetings,

Andres Freund


Commits

  1. Apply unconstify() in more places

  2. Improve unconstify() documentation

  3. Drop const cast from dlsym() calls

  4. Const-ify a few more large static tables.

  5. Improve tzparse's handling of TZDEFRULES ("posixrules") zone data.

  6. Avoid statically allocating statement cache in ecpglib/prepare.c.

  7. Reorder FmgrBuiltin members, saving 25% in size.

  8. Add macro to cast away const without allowing changes to underlying type.

  9. Mark constantly allocated dest receiver as const.

  10. Avoid statically allocating formatting.c's format string caches.

  11. Correct constness of system attributes in heap.c & prerequisites.

  12. Avoid statically allocating gmtsub()'s timezone workspace.

  13. Correct constness of a few variables.

  14. Move the replication lag tracker into heap memory.