POSIX или PCRE


Прислал: Данил Емельянов [ 24.05.2007 @ 14:37 ]
Раздел:: [ Веб-технологии ]


Здравствуйте уважаемые читатели. В данной статье я провел анализ языков регулярных выражений POSIX и PCRE.Если данная статья будет иметь успех, я с радостью продолжу сравнение этих языков.

"PCRE(Perl Compatible Regular Expression) - регулярное выражение языка Perl. Использует аппарат недетерминированных конечных автоматов(НКА)
POSIX(Portable Operation System Interface) - переносимый интерфейс операционной системы. Использует аппарат детерминированных конечных автоматов(ДКА).
Механизмы работы анализатора сильно различаются, но это уже технические детали" - Д.Котеров, А.Костарев(PHP5).

Работал я следующим образом. Создал на Apache сервере два файла с кодом POSIX и PCRE соответственно. До запуска регулярного выражения замерял время работы скрипта, используя функцию microtime(true)

$start=microtime(true);
//выражение
$end=microtime(true);
printf("<br>Время работы:%.8f c",$end-$start);

Конструкция чтения из файла в примере №4 может не является оптимальной, но т.к. я ее использовал как для POSIX, так и для PCRE разницы особой нету.

1.Опыт первый. Проверим скорость работы на поиск искомого значения в строке.

1.1) POSIX

eregi("big","You are my big friend",$pockets);
print_r($pockets);
//Результат колеблется от 0.00008988сек. до 0.00005007сек.

1.2) PCRE

preg_match("/big/","You are my big friend",$pockets);
print_r($pockets);
//Результат от 0.00006008сек до 0.00005698 cек

Результат: при использовании языка POSIX время работы скрипта колеблется с большим диапазоном, в то время как время работы PCRE более стабильнее.

2.Опыт второй. Проверим скорость работы при замене искомого значения в строке.

2.1) POSIX

$str=eregi_replace("are","@","You are my big friend");
print($str);
//Время от 0.00002193сек до 0.00002313 сек.

2.2) PCRE

$str=preg_replace("/are/","@","You are my big friend");
print($str);
//Время от 0.00002098cек. до 0.00002193cек.

Результат: в данном примере PCRE сработал быстрее нежели POSIX.

3.Опыт третий. Замена даты формата(гггг-мм-дд) в формат(дд.мм.гггг)

3.1) POSIX

$date="2007-03-05";
$str=eregi_replace("([0-9]{4})-([0-9]{2})-([0-9]{2})","\3.\2.\1",$date);
echo $str;
//Время от 0.00003314cек. до 0.00003600cек.

3.2) PCRE

$date="2007-03-05";
$str=preg_replace("/(d{4})-(d{2})-(d{2})/","$3.$2.$1",$date);
echo $str;
//Время от 0.00002599cек. до 0.00002694cек.

Результат: и в данном примере PCRE показывает себя с лучшей стороны.

4.Опыт четвертый. Сейчас мы проверим скорость работы с большими файлами.В файл sr.txt запишем следующие предложения " Я приехал в деревню к бабушке. Меня там встретили очень хорошо. У бабушки есть мыло babka@mail.ru Бабушкин e-mail похож на мой krutoi@mail.ru .У моих друзей тоже свои адреса: dinko@lamer.ru, kon@yandex.com и другие." неопределенное количество раз(у меня около 50раз).

4.1) POSIX

$file=file("sr.txt");
foreach($file as $key=>$val)
{ $val=eregi_replace("([A-Za-z0-9]{2,}@[A-Za-z0-9]{2,}.[a-z]{2,3})","<a href=mailto:\0>\0</a>",$val);
echo $val,"<br>";
}
//Время:0.01098394cек. и больше
//Удвоил размер файла, результат:0.02239799cек.

4.2) PCRE

$file=file("sr.txt");
foreach($file as $key=>$val)
{
$val=preg_replace("/(w+)@(w+).(w{2,3})/","<a href=mailto:$0>$0</a>",$val);
echo $val,"<br>";
}
//Время от 0.00658989cек. до 00693202cек.
//Удвоил размер файла, результат:0.01370597сек.

Результат: При работе с большими файлами PCRE отбирает очко у POSIX и вырывается вперед.

Вывод: При работе с большими ресурсами используйте язык PCRE, а в остальных случаях на ваш выбор, но по-моему факты в пользу PCRE на лицо.