• Tom Lane's avatar
    Save a few cycles in advance_transition_function(). · e6336b8b
    Tom Lane authored
    Keep a pre-initialized FunctionCallInfoData in AggStatePerAggData, and
    re-use that at each row instead of doing InitFunctionCallInfoData each
    time.  This saves only half a dozen assignments and maybe some stack
    manipulation, and yet that seems to be good for a percent or two of the
    overall query run time for simple aggregates such as count(*).  The cost
    is that the FunctionCallInfoData (which is about a kilobyte, on 64-bit
    machines) stays allocated for the duration of the query instead of being
    short-lived stack data.  But we're already paying an equivalent space cost
    for each regular FuncExpr or OpExpr node, so I don't feel bad about paying
    it for aggregate functions.  The code seems a little cleaner this way too,
    since the number of things passed to advance_transition_function decreases.
    e6336b8b
nodeAgg.c 67.9 KB