• Tom Lane's avatar
    Marginal performance hacking in erand48.c. · 6b9bba2d
    Tom Lane authored
    Get rid of the multiplier and addend variables in favor of hard-wired
    constants.  Do the multiply-and-add using uint64 arithmetic, rather
    than manually combining several narrower multiplications and additions.
    Make _dorand48 return the full-width new random value, and have its
    callers use that directly (after suitable masking) rather than
    reconstructing what they need from the unsigned short[] representation.
    
    On my machine, this is good for a nearly factor-of-2 speedup of
    pg_erand48(), probably mostly from needing just one call of ldexp()
    rather than three.  The wins for the other functions are smaller
    but measurable.  While none of the existing call sites are really
    performance-critical, a cycle saved is a cycle earned; and besides
    the machine code is smaller this way (at least on x86_64).
    
    Patch by me, but the original idea to optimize this by switching
    to int64 arithmetic is from Fabien Coelho.
    
    Discussion: https://postgr.es/m/1551.1546018192@sss.pgh.pa.us
    6b9bba2d
erand48.c 3.89 KB