WebScript.Ru
C:\   главная  ::   о сайте  ::  каталог скриптов  ::  гнездо  ::  форум  ::   авторам  :: Новостройки ::   ХОСТИНГ  ::

|| разделы::
|| поиск по сайту::

|| реклама::
|| новости почтой::
Рассылки Subscribe.Ru ::



Новости сайта WebScript.Ru
Популярные статьи

Hot 5 Stories

|| рекомендуем::




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 на лицо.


 :::::  Alex пишет 24.05.2007 @ 19:21 
Я бы первые три опыта делал в цикле несколько сот раз и усреднял. Был бы меньше разброс значений. Правда PCRE компилирует шаблоны и последующие вызовы делаются намного быстрее...
 :::::  Таинственный пишет 18.07.2007 @ 12:40 
Интересно, да. Просто со вкусом и на примерах.
 :::::  Samson пишет 29.07.2007 @ 00:44 
Профанация.
Автор пытается приводить "точные числовые значения", но при этом не приводит расчёт погрешностей и, похоже, даже не догадывается о необходимости округления. И, не зная погрешностей -- пытается сравнивать и делать какие-то выводы!!
Без оценки погрешностей (да ещё и с таким большим разбросом, порою до 80%!) никакие сравнения и выводы -- попросту невозможны.

Подобные признаки заставляют задуматься об уровне компетентности автора...
 :::::  Александр пишет 08.08.2007 @ 21:56 
В принципе, эти тесты всё равно очень относительны. Скорость выполнения может зависить от многих факторов: ОС, свободных ресурсов компьютера. Например, одна операция может работать быстрее, но требовать больше памяти и когда свободная память закончится, то она станет работать медленнее. Могут быть и другие факторы. Это кстати подтверждает и такой разброс значений, которые получились в результате тестов.
Статья выглядела бы несколько серьезнее, если бы были данные, на чем всё это тестировалось более подробные: параметры сервера (железа), версии используемого ПО. А заодно более подробные данные по количеству тестов, можно посчитать среднее значение, разброс (как там, математическое ожидание и дисперсия, кажется :) , или, может, это сильно заумно будет). Ну, тогда было бы проще и погрешности расчитать.
Но с выводами статьи полностью согласен, я тоже слышал, что PCRE работает как правило быстрее.
Имя:
Email:
URL

Введите сумму двух чисел девять и шесть (девять+шесть=?)
Запомнить мою информацию

* Html запрещен* Ваш E-mail опубликован не будет.

Copyright © 2000-2001 WebScript.Ru nas@webscript.ru
Design © 2001 by Parallax Design Studio (aka Spectator.ru)
Все торговые марки и авторские права на эту страницу принадлежат их соответствующим владельцам.
Сгенерировано за: 0.0587959