Регулярные выражения: PHP(POSIX) vs Perl.
PHP поддерживает регулярные выражения стандарта POSIX/eger*/ и PERL/preg*/-ориентированные (об их различии тут - php.spb.ru/regular_expression.html). Кто из них работает быстрее?
Хочу заранее предупредить любителей Перла, чтобы не радовались: хоть перловые реги и круче пхпышных, только ничто и никто не мешает использовать в PHP перловые реги! Наверно, потому их и встроили в PHP, что уж больно тормоза большие... :-)
Итак, простейший текст. Поиск простого выражения в тексте, который состоит из многократного повторения данной статьи (получается размер переменной $text в 3 Мб).
Тест вызывает всего 1 раз, ибо реги имеют встроенное средство для кеширования результатов компиляции. Т.е. перед запуском проиходит компиляции, а повторные реги не компилируются. Это особенности регулярных выражений. Разные языки программирования в состоянии хранить разное число откомпилированных выражений, что вызывались (в порядке вызова в программе). И в данном тесте как раз нет эффекта от компиляции, т.к. функция вызывается всего один раз.
- {eregi("МаС+иВ",$text);}
- {preg_match("/МаС+иВ/im",$text);}
- {eregi("(ма[a-zа-я]{1,20})",$text);}
- {preg_match("/(ма[a-zа-я]{1,20})/im",$text);}
- {eregi("(ма[a-zа-я]{1,20})",$text);}
- {preg_match("/(ма[a-zа-я]{1,20})/im",$text);}
- {eregi("([a-z_-]+@([a-z][a-z-]*\.)+([a-z]{2}|com|mil|org|net|gov|edu|arpa|info|biz))",$text);}
- {preg_match("/([a-z_-]+@([a-z][a-z-]*\.)+([a-z]{2}|com|mil|org|net|gov|edu|arpa|info|biz))/im",$text);}
- {eregi("([a-z_-]+@([a-z][a-z-]*\.)+([a-z]{2}|com|mil|org|net|gov|edu|arpa|info|biz))",$text,$ok);echo $ok[1];}
- {preg_match("/([a-z_-]+@([a-z][a-z-]*\.)+([a-z]{2}|com|mil|org|net|gov|edu|arpa|info|biz))/im",$text,$ok); echo $ok[1];}
- {eregi("МаС+иВ",$text);}
- {preg_match("/МаС+иВ/im",$text);}
счетчик | кол-во вызовов |
общее вpемя | сpеднее вpемя |
% от min | % от max | общее время |
test N1 | 1 | 1.3339 | 1.3339 | 107.8% | 100.0% |
счетчик | кол-во вызовов |
общее вpемя | сpеднее вpемя |
% от min | % от max | общее время |
test N1 | 1 | 0.4521 | 0.4521 | 76.9% | 100.0% |
счетчик | кол-во вызовов |
общее вpемя | сpеднее вpемя |
% от min | % от max | общее время |
test N1 | 1 | 1.3430 | 1.3430 | 60.6% | 100.0% |
счетчик | кол-во вызовов |
общее вpемя | сpеднее вpемя |
% от min | % от max | общее время |
test N1 | 1 | 11.6828 | 11.6828 | 680.3% | 100.0% |
счетчик | кол-во вызовов |
общее вpемя | сpеднее вpемя |
% от min | % от max | общее время |
test N1 | 1 | 0.5854 | 0.5854 | 00.0% | 10.2% |
счетчик | кол-во вызовов |
общее вpемя | сpеднее вpемя |
% от min | % от max | общее время |
test N1 | 1 | 17.6384 | 17.6384 | 72381.4% | 100.0% |