Skip to content
Snippets Groups Projects
  • Heikki Linnakangas's avatar
    5cb0e335
    Speed up operations on numeric, mostly by avoiding palloc() overhead. · 5cb0e335
    Heikki Linnakangas authored
    In many functions, a NumericVar was initialized from an input Numeric, to be
    passed as input to a calculation function. When the NumericVar is not
    modified, the digits array of the NumericVar can point directly to the digits
    array in the original Numeric, and we can avoid a palloc() and memcpy(). Add
    init_var_from_num() function to initialize a var like that.
    
    Remove dscale argument from get_str_from_var(), as all the callers just
    passed the dscale of the variable. That means that the rounding it used to
    do was not actually necessary, and get_str_from_var() no longer scribbles on
    its input. That makes it safer in general, and allows us to use the new
    init_var_from_num() function in e.g numeric_out().
    
    Also modified numericvar_to_int8() to no scribble on its input either. It
    creates a temporary copy to avoid that. To compensate, the callers no longer
    need to create a temporary copy, so the net # of pallocs is the same, but this
    is nicer.
    
    In the passing, use a constant for the number 10 in get_str_from_var_sci(),
    when calculating 10^exponent. Saves a palloc() and some cycles to convert
    integer 10 to numeric.
    
    Original patch by Kyotaro HORIGUCHI, with further changes by me. Reviewed
    by Pavel Stehule.
    5cb0e335
    History
    Speed up operations on numeric, mostly by avoiding palloc() overhead.
    Heikki Linnakangas authored
    In many functions, a NumericVar was initialized from an input Numeric, to be
    passed as input to a calculation function. When the NumericVar is not
    modified, the digits array of the NumericVar can point directly to the digits
    array in the original Numeric, and we can avoid a palloc() and memcpy(). Add
    init_var_from_num() function to initialize a var like that.
    
    Remove dscale argument from get_str_from_var(), as all the callers just
    passed the dscale of the variable. That means that the rounding it used to
    do was not actually necessary, and get_str_from_var() no longer scribbles on
    its input. That makes it safer in general, and allows us to use the new
    init_var_from_num() function in e.g numeric_out().
    
    Also modified numericvar_to_int8() to no scribble on its input either. It
    creates a temporary copy to avoid that. To compensate, the callers no longer
    need to create a temporary copy, so the net # of pallocs is the same, but this
    is nicer.
    
    In the passing, use a constant for the number 10 in get_str_from_var_sci(),
    when calculating 10^exponent. Saves a palloc() and some cycles to convert
    integer 10 to numeric.
    
    Original patch by Kyotaro HORIGUCHI, with further changes by me. Reviewed
    by Pavel Stehule.