Minulý článek mne namotivoval, abych si ve své malé laboratoři uspořádal miniolympiádu nahrazovacích funkcí. Pojďme na to.
Soutěžící
- str_replace
- ereg_replace
- preg_replace
Disciplíny
- náhrada na začátku řetězce
- mnohonásobná náhrada
- extrakce
Pravidla
Každý soutěžící bude mít 100 pokusů na jednu disciplínu.
Úkolem každé disiplíny bude 10 000x provést zvolený typ náhrady.
Hodnotící kritéria budou dvě:
- počet dotazů za sekundu měřený Apache Benchem (request per second - RPS)
- průměrovaný čas měřený přímo v PHP skriptu (čas v ms)
Náhrada na začátku řetězce
V této disciplíně musela funkci str_replace pomáhat její kamarádka strpos.
if (strpos($text, 'http://') === 0) str_replace('http://', '', $text);
preg_replace('%^http://%', '', $text);
ereg_replace('^http://', '', $text);
Závodník | RPS | čas |
strpos + str_replace | 15 | 105 |
preg_replace | 25 | 71 |
ereg_replace | 14 | 127 |
Na zkoušku jsme pak ještě nechali poslední dva závodníky provést před náhradou expanzi:
preg_replace('%^http://(.*)$%', '$1', $text);
ereg_replace('^http://(.*)$', '$1', $text);
Závodník | RPS | čas |
preg_replace | 22 | 87 |
ereg_replace | 1,14 | 1227 |
Mnohonásobná náhrada
str_replace('abc', 'cba', $text);
preg_replace('%abc%', 'cba', $text);
ereg_replace('abc', 'cba', $text);
Závodník | RPS | čas |
str_replace | 32 | 60 |
preg_replace | 22 | 88 |
ereg_replace | 11 | 171 |
Extrakce
str_replace('" />', '', str_replace('<img src="', '', $text));
preg_replace('%^<img src="([^"]+)" />$%', '$1', $text);
ereg_replace('^<img src="([^"]+)" />$', '1', $text);
Závodník | RPS | čas |
str_replace | 19 | 102 |
preg_replace | 24 | 78 |
ereg_replace | 3,65 | 527 |
Po přidání volitelných mezer
preg_replace('%^<img +src="([^"]+)" +/>$%', '$1', $text);
ereg_replace('^<img +src="([^"]+)" +/>$', '1', $text);
nám ereg zpomaluje až k 800ms, zatímco preg zůstává na hezkých 80ms.
Vyhlášení vítězů
Výsledky asi nebudou pro znalého diváka žádným překvapením.
Str_replace obhájila své prvenství v úkolu, ke kterému byla stvořena, tedy v jednoduché vícenásobné náhradě prostého textu.
Mezi sestrami regulárkami nebyl favorit předem tolik zřejmý (alespoň pro mne). Jak je ale vidno z výsledků, preg svou sestřičku ereg naprosto rozdrtila. Jakmile začne ereg jen trochu expandovat, zadýchá se až hrůza.
Závěr
K jednoduchým vícenásobným náhradám textu se vyplatí použít str_replace. Ke všemu ostatnímu pak výborně poslouží preg_replace. Chudince ereg_replace můžeme tak leda vykopat hrob.
Zajímavé, napadlo mě, že by byla preg rychlejší, ale až tak? Čím to?