Re: In PG12, query with float calculations is slower than PG11

Поиск
Список
Период
Сортировка
От Andres Freund
Тема Re: In PG12, query with float calculations is slower than PG11
Дата
Msg-id 20200213172340.6umuah4r5q4k2fmq@alap3.anarazel.de
обсуждение исходный текст
Ответ на Re: In PG12, query with float calculations is slower than PG11  (Emre Hasegeli <emre@hasegeli.com>)
Ответы Re: In PG12, query with float calculations is slower than PG11  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-hackers
Hi,

On 2020-02-13 16:25:25 +0000, Emre Hasegeli wrote:
> And also this commit is changing the usage of unlikely() to cover
> the whole condition.  Using it only for the result is not semantically
> correct.  It is more than likely for the result to be infinite when
> the input is, or it to be 0 when the input is.

I'm not really convinced by this fwiw.

Comparing

    if (unlikely(isinf(result) && !isinf(num)))
        float_overflow_error();

with

    if (unlikely(isinf(result)) && !isinf(num))
        float_overflow_error();

I don't think it's clear that we want the former. What we want to
express is that it's unlikely that the result is infinite, and that the
compiler should optimize for that. Since there's a jump involved between
the check for isinf(result) and the one for !isinf(num), we want the
compiler to implement this so the non-overflow path follows the first
check, and the rest of the check is later.



> +void float_overflow_error()
> +{

Tom's probably on this, but it should be (void).


> @@ -2846,23 +2909,21 @@ float8_accum(PG_FUNCTION_ARGS)
>  
>          /*
>           * Overflow check.  We only report an overflow error when finite
>           * inputs lead to infinite results.  Note also that Sxx should be NaN
>           * if any of the inputs are infinite, so we intentionally prevent Sxx
>           * from becoming infinite.
>           */
>          if (isinf(Sx) || isinf(Sxx))
>          {
>              if (!isinf(transvalues[1]) && !isinf(newval))
> -                ereport(ERROR,
> -                        (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
> -                         errmsg("value out of range: overflow")));
> +                float_overflow_error();
>  
>              Sxx = get_float8_nan();
>          }
>      }

Probably worth unifiying the use of unlikely around isinf here and in
the follow functions.


Greetings,

Andres Freund



В списке pgsql-hackers по дате отправления:

Предыдущее
От: Ranier Vilela
Дата:
Сообщение: Re: [PATCH] libpq improvements and fixes
Следующее
От: Tom Lane
Дата:
Сообщение: Re: In PG12, query with float calculations is slower than PG11