что быстрее ereg() или preg_match()?

number1215

Новичок
что быстрее ereg() или preg_match()?

кто может дать обоснованный ответ, что быстрее ereg() или preg_match()? :) и какую из них лучше использовать?

Раньше слышал, что "перловская" функция работает быстрее, а ereg считается чуть ли не устаревшей, но сейчас не могу найти адекватной инфы по этим функциям
 

Tor

Новичок
что мешает попробовать именно на своих данных?
 

zarus

Хитрожопый макак
В мане по пхп черным по белому написано, что быстрее str_pos. :)

Description
int ereg ( string pattern, string string [, array &regs] )

Note: preg_match(), which uses a Perl-compatible regular expression syntax, is often a faster alternative to ereg().
 

number1215

Новичок
Спасибо. Гляжу (на php.net) на

Замечание: preg_match(), which uses a Perl-compatible regular expression syntax, is often a faster alternative to ereg().

и не вижу :(

Спасибо.
 

berkut

Новичок
preg_match(), which uses a Perl-compatible regular expression syntax, is often a faster alternative to ereg().
если нужно, могу найти 2 примера из реальных проектов, где ерег работает в 16! раз быстрее прег
 

zarus

Хитрожопый макак
Какой шаблон задать, так и будет работать.
 

number1215

Новичок
Автор оригинала: berkut
preg_match(), which uses a Perl-compatible regular expression syntax, is often a faster alternative to ereg().
если нужно, могу найти 2 примера из реальных проектов, где ерег работает в 16! раз быстрее прег
давай посмотрим :)
если наблюдается такая разница скорее всего ereg и preg_match должны быть построены на разных типах КА
 

zarus

Хитрожопый макак
2Намбер1215
preg_match универсальнее, за счет модификаторов, а при использовании ereg нужно будет использовать кучу разных функций. Пустячок-с, но иногда бесит.
 

berkut

Новичок
Задача: выдернуть всё, что находится после тега <body> из хтмл-ки
PHP:
function getMicrotime()
{
    list ($usec, $sec) = explode(' ', microtime());
    return (floatval($usec) + floatval($sec));
}

$c = file_get_contents('1.htm'); // ~146 Kb
$pattern = '.+<BODY[^>]*>';

if (0) {
    $t1 = getMicrotime();    
    eregi_replace($pattern, '', $c);
}
else {
    $pattern = '#' . $pattern . '#i';
    $t1 = getMicrotime();
    preg_replace($pattern, '', $c);
}  
echo getMicrotime() - $t1 , '<br>';
ereg - 0.06 c
preg - 2.6 c
Если кто-то напишет паттерн для прега, который будет работать значителльно быстрее, буду рад посмотреть.

Второй пример в каком скрипте так сразу и не вспомнил, искать влом. Ещё в книге Котерова php5 пример был, правда чисто теоретический, к практике мало имеет отношения.
 

_RVK_

Новичок
Учимся верно писать реги. Задача вытащить все после боди.

PHP:
<?php
<?php
function getMicrotime()
{
    list ($usec, $sec) = explode(' ', microtime());
    return (floatval($usec) + floatval($sec));
}

$c = file_get_contents('1.htm'); // Эта страница до моего поста
$t1 = getMicrotime();
eregi_replace('.+<BODY[^>]*>', '', $c);

echo getMicrotime() - $t1 , '<br>';

$t1 = getMicrotime();
preg_match('/<BODY.*?>(.*)/is', $c, $mathes);

echo getMicrotime() - $t1 , '<br>';

print $mathes[1];
?>

preg отработал в 10 раз быстрее.
PS. Сори, не знаю синтаксиса POSIX, потому первый рег не менял
 

berkut

Новичок
Поправка. Что-бы получить тот-же результат, что и ереги, паттерн для прега должен выглядеть так:
$pattern = '#' . $pattern . '#is';
т.е. #.+?<BODY[^>]*>#is
и в этом случае, на странице в 146Kb php вообще зацикливается! Даже не вылетает по max execution time!съедает всё время на одном из процессоров

-~{}~ 30.11.05 13:49:

_RVK_
здорово!
 

_RVK_

Новичок
berkut
просто 2.6 сек это откровенные тормоза. Таких проколов быть не может. Вывод: здесь есть что оптимизировать.

-~{}~ 30.11.05 12:57:

И общий вывод. ereg* на помойку, забыть и не вспоминать. И дело не в скорости. Дело в возможностях, удобстве, поддержке.... А скорость, как мы увидели всегда можно загнать в приемлемые рамки.
 

berkut

Новичок
да, всё дело в моих кривых руках, не прав.
Но почему
PHP:
preg_replace('#.+?<BODY[^>]*>#is', '', file_get_contents('1.htm'));
при условии, что файл не очень маленький, не вылетает по тайм ауту? баг или опять я глючу? может кто проверит?
 

number1215

Новичок
ereg - на помойку ... ок

а чем можно заменить mb_ereg()?
работает ли preg_match() корректно с multibyte?
 

alex_kh

Новичок
Автор оригинала: berkut
Задача: выдернуть всё, что находится после тега <body> из хтмл-ки
PHP:
ereg - 0.06 c
preg - 2.6 c
Если кто-то напишет паттерн для прега, который будет работать значителльно быстрее, буду рад посмотреть.

Второй пример в каком скрипте так сразу и не вспомнил, искать влом. Ещё в книге Котерова php5 пример был, правда чисто теоретический, к практике мало имеет отношения. [/QUOTE]
Ну, Вы, блин, даете !!!
Зачем столько кода ???

Если нужно вернуть все после <body>:

list($a,$b)=preg_split('/<body[^>]+>/i',$body,2);

В $b будет то, что вым нужно.


Гарантирую, что этот скрипт будет работать бастрее всего, так как поиск ведется только до первого вхождения шаблона, а не повсему документу.
 

_RVK_

Новичок
alex_kh
Прежде чем писать в топики, советую подучить матчасть.
//[\S\s] вместо "." ,так как в некоторых версиях PHP точка не включает символы переноса строки, а они могут быть
Ты видимо не знаешь про модификатор s?

Не говоря о том, что вариант приведенный мной, оптимизации не требует. Даже если твой вариант работает в миллион раз быстрее.

Я конечно тебя понимаю. Хочется показать свою крутость, и все такое. Но думай в следующий раз, прежде чем писать. ок?
 
Сверху