Actual database access seems about the same, but from everything I have seen, PL/V8 always beats PL/pgSQL in terms of performance for logic.
create extension if not exists plv8;
create or replace function fizz_buzz_plv8() returns text volatile language plv8 as $$
var result = "";
for(var i=0; i <= 100000; i++) {
if(i % 3 == 0) result += "Fizz";
if(i % 5 == 0) result += "Buzz";
if(result == "") result += i;
}
return result;
$$;
create or replace function fizz_buzz_plpgsql() returns text volatile language plpgsql as $$
declare
result text = '';
begin
for i in 0 .. 100000 loop
if i % 3 = 0 then result = result || 'Fizz'; end if;
if i % 5 = 0 then result = result || 'Buzz'; end if;
if result = '' then result = result || i; end if;
end loop;
return result;
end
$$;
select fizz_buzz_plv8(); // 52 ms
select fizz_buzz_plpgsql(); // 1292 ms
1 comment:
concatenation, eg,
result = result || 'Fizz';
is very expensive in plpgsql.
allocation / deallocation is expensive, and no string buffer optimizations are taken.
Post a Comment