Hi

this code is +/- equal to Oracle (it should be eliminate a useless code)

postgres=# DO LANGUAGE plpgsql $$ DECLARE n real;
DECLARE f integer;
BEGIN
FOR f IN 1..10000000 LOOP
--if 0=0 then
n = SQRT (f)::real;
--end if;
END LOOP;
RAISE NOTICE 'Result => %',n;
END $$;
NOTICE:  Result => 3162.28
DO
Time: 5787.797 ms



2014-08-06 21:41 GMT+02:00 Pavel Stehule <pavel.steh...@gmail.com>:

> Hi
>
> I returned to this issue and maybe I found a root issue. It is PL/pgSQL
> implicit IO cast
>
> Original text:
>
> postgres=# DO LANGUAGE plpgsql $$ DECLARE n real;
>
> DECLARE f integer;
> BEGIN
> FOR f IN 1..10000000 LOOP
> if 0=0 then
> n = SQRT (f);
> end if;
> END LOOP;
> RAISE NOTICE 'Result => %',n;
> END $$;
> NOTICE:  Result => 3162.28
> DO
> Time: 31988.720 ms
>
> Little bit modified
>
> postgres=# DO LANGUAGE plpgsql $$ DECLARE n real;
>
> DECLARE f integer;
> BEGIN
> FOR f IN 1..10000000 LOOP
> if 0=0 then
> n = SQRT (f)::real;
> end if;
>
> END LOOP;
> RAISE NOTICE 'Result => %',n;
> END $$;
> NOTICE:  Result => 3162.28
> DO
> Time: 9660.592 ms
>
> It is 3x faster
>
> there is invisible IO conversion from double precision::real via libc
> vfprintf
>
> https://github.com/okbob/plpgsql_check/ can raise a performance warning
> in this situation, but we cannot do too much now without possible breaking
> compatibility
>
> Regards
>
> Pavel
>
>
> 2014-08-05 16:02 GMT+02:00 Roberto Mello <roberto.me...@gmail.com>:
>
> On Tue, Aug 5, 2014 at 9:50 AM, Kevin Grittner <kgri...@ymail.com> wrote:
>> >
>> > Since that is outside the loop, the difference should be nominal;
>>
>> Apologies. I misread on my phone and though it was within the loop.
>>
>> > and in a quick test it was.  On the other hand, reducing the
>> > procedural code made a big difference.
>>
>> <snip>
>>
>> > test=# DO LANGUAGE plpgsql $$ DECLARE n real;
>> > BEGIN
>> >   PERFORM SQRT(f) FROM generate_series(1, 10000000) x(f);
>> > END $$;
>> > DO
>> > Time: 3916.815 ms
>>
>> That is a big difference. Are you porting a lot of code from PL/SQL,
>> and therefore evaluating the performance difference of running this
>> code? Or is this just a general test where you wish to assess the
>> performance difference?
>>
>> PL/pgSQL could definitely use some loving, as far as optimization
>> goes, but my feeling is that it hasn't happened because there are
>> other suitable backends that give the necessary flexibility for the
>> different use cases.
>>
>> Roberto
>>
>>
>> --
>> Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
>> To make changes to your subscription:
>> http://www.postgresql.org/mailpref/pgsql-hackers
>>
>
>

Reply via email to