SQL, przetestowałem to z poniższego skryptu:
set timing on
select sum(length(x)) from (
select translate('(<FIO>)', '()[]', '----') x
from (
select *
from dual
connect by level <= 2000000
)
);
select sum(length(x)) from (
select regexp_replace('[(<FIO>)]', '[\(\)\[]|\]', '-', 1, 0) x
from (
select *
from dual
connect by level <= 2000000
)
);
i stwierdzono, że wydajność translate
i regexp_replace
były prawie zawsze takie same, ale może być, że koszt innych operacji jest przytłaczający kosztem funkcji, które próbuję przetestować.
Następnie próbowałem wersji PL/SQL:
set timing on
declare
x varchar2(100);
begin
for i in 1..2500000 loop
x := translate('(<FIO>)', '()[]', '----');
end loop;
end;
/
declare
x varchar2(100);
begin
for i in 1..2500000 loop
x := regexp_replace('[(<FIO>)]', '[\(\)\[]|\]', '-', 1, 0);
end loop;
end;
/
Tu wersja translate
zajmuje niecałe 10 sekund, podczas gdy wersja regexp_replace
około 0,2 sekundy - około 2 rzędy wielkości szybciej
(!)
Na podstawie tego wyniku będę częściej używać wyrażeń regularnych w moim kluczowym kodzie wydajności - zarówno SQL, jak i PL/SQL.
Myślę, że podchodzisz do wniosku nieco pośpiesznie :) Jeśli się nad tym zastanowisz, tylko optymalizacja pamięci podręcznej może wyjaśnić tę ogromną różnicę w czasie wykonywania. W realnym przykładzie na pewno nie przekonwertowałbyś tego samego łańcucha w kółko. –
Warto jednak zauważyć, że w niektórych przypadkach 'regexp' ** jest szybsze ** niż' translate' :) –
Po 10g stwierdzam, że REGEXP_ jest niezawodnie o jeden lub dwa rzędy wielkości wolniejsze niż ich analogi non-REGEXP (gdy robiąc wystarczająco dużo, aby zmierzyć różnicę). Jednak wersja 10g była pierwszą wersją z wbudowanymi funkcjami regex i oczekiwałbym, że Oracle będzie miało pewne znaczące dostrojenie do 11g. – APC