• Tom Lane's avatar
    Make assorted performance improvements in snprintf.c. · abd9ca37
    Tom Lane authored
    In combination, these changes make our version of snprintf as fast
    or faster than most platforms' native snprintf, except for cases
    involving floating-point conversion (which we still delegate to
    the native sprintf).  The speed penalty for a float conversion
    is down to around 10% though, much better than before.
    
    Notable changes:
    
    * Rather than always parsing the format twice to see if it contains
    instances of %n$, do the extra scan only if we actually find a $.
    This obviously wins for non-localized formats, and even when there
    is use of %n$, we can avoid scanning text before the first % twice.
    
    * Use strchrnul() if available to find the next %, and emit the
    literal text between % escapes as strings rather than char-by-char.
    
    * Create a bespoke function (dopr_outchmulti) for the common case
    of emitting N copies of the same character, in place of writing
    loops around dopr_outch.
    
    * Simplify construction of the format string for invocations of sprintf
    for floats.
    
    * Const-ify some internal functions, and avoid unnecessary use of
    pass-by-reference arguments.
    
    Patch by me, reviewed by Andres Freund
    
    Discussion: https://postgr.es/m/11787.1534530779@sss.pgh.pa.us
    abd9ca37
snprintf.c 31 KB