• David Rowley's avatar
    Improve compiler code layout in elog/ereport ERROR calls · 913ec71d
    David Rowley authored
    Here we use a bit of preprocessor trickery to coax supporting compilers
    into laying out their generated code so that the code that's in the same
    branch as elog(ERROR)/ereport(ERROR) calls is moved away from the hot
    path.  Effectively, this reduces the size of the hot code meaning that it
    can sit on fewer cache lines.
    
    Performance improvements of between 10-15% have been seen on highly CPU
    bound workloads using pgbench's TPC-b benchmark.
    
    What's achieved here is very similar to putting the error condition inside
    an unlikely() macro. For example;
    
    if (unlikely(x < 0))
        elog(ERROR, "invalid x value");
    
    now there's no need to make use of unlikely() here as the common macro
    used by elog and ereport will now see that elevel is >= ERROR and make use
    of a pg_attribute_cold marked version of errstart().
    
    When elevel < ERROR or if it cannot be determined to be constant, the
    original behavior is maintained.
    
    Author: David Rowley
    Reviewed-by: Andres Freund, Peter Eisentraut
    Discussion: https://postgr.es/m/CAApHDvrVpasrEzLL2er7p9iwZFZ%3DJj6WisePcFeunwfrV0js_A%40mail.gmail.com
    913ec71d
elog.h 16.3 KB