Тест. Кто быстрее: preg_replace() или str_replace()?
Недавно к моему посту “Парсинг выдачи Google. Практика.” [YS.PRO] оставил коммент следующего содержания:
$Result=preg_replace(”/[\n\r\t]/”, ”, $Result);
Ох не нравится мне это, зачем комп мучать?
$result = str_replace(array(”\n”, “\r”, “\t”), ”, $result);
Конечно же сомневаться в том, что на данной операции str_replace() быстрее мне не приходится, но мне все-таки захотелось протестировать разницу в скорости при использовании этих двух функций.
Начальные условия:
- PHP 5
- Apache 2
- Параллельно запущено 4 громадных скрипта, которые уже проработали 3е суток, так что определенную погрешность из-за них можно ожидать
Тестирование производилось при помощи следующего кода.
Код №1
<?php require_once 'timer.class.php'; $text="Почему я делаю это?\r\nНе знаю, но это весело!\r\nВедь надо же стать легендой )"; echo $text; $timer=new Timer(); $timer->start(); $Result=preg_replace("/[nrt]/",'', $text); $point=$timer->stop(); echo $point; if($fh=fopen('preg.txt','a')) { fwrite($fh,$point."\r\n"); fclose($fh); } else { echo 'Вечная ошибка с файловой системой!'; } ?>
Код №2
<?php require_once 'timer.class.php'; $text="Почему я делаю это?\r\nНе знаю, но это весело!\r\nВедь надо же стать легендой )"; echo $text; $timer=new Timer(); $timer->start(); $result = str_replace(array("n", "r", "t"), '', $text); $point=$timer->stop(); echo $point; if($fh=fopen('str.txt','a')) { fwrite($fh,$point."\r\n"); fclose($fh); } else { echo 'Вечная ошибка с файловой системой!'; } ?>
Класс Timer имеет следующий вид:
<?php class Timer { var $timers = array(); var $precision = ''; function Timer($prec=6) { $this->precision=$prec; } function get_precision() { return $this->precision; } function set_precision($new_precision) { $this->precision=$new_precision; } function _getmicrotime() { list($msec,$sec)=explode(" ",microtime()); return ($sec.substr($msec,1)); } function start($timer='def') { $this->timers[$timer]=$this->_getmicrotime(); return true; } function stop($timer='def') { if(!array_key_exists($timer,$this->timers)) return false; return round($this->_getmicrotime()-$this->timers[$timer],$this->precision); } } ?>
В результате тестирования были получены следующие результаты для preg_replace():
6.6E-5
0.212309
0.212233
-1.0E-6
-1.0E-6
-1.0E-6
0.000571
0.000126
0.000132
0.000443
И как результат среднее время: 0.0425877 секунд.
В свою очередь для str_replace() были получены такие результаты:
4.0E-5
4.2E-5
-1.0E-6
-2.0E-6
-1.0E-6
0.000291
0.212443
0.000484
0.000212
-1.0E-6
И как результат среднее время: 0.0213507 секунд.
Среднее время измерялось при помощи следующего скрипта:
$nums1=@file('str.txt'); $nums2=@file('preg.txt'); $sum1=0; $sum2=0; foreach ($nums1 as $num) { $sum1+=$num; } foreach ($nums2 as $num) { $sum2+=$num; } echo 'str:',round($sum1/10,12)."\r\n"; echo 'preg:',round($sum2/10,12)."\r\n"; ?>
Выводы:
1. Для операции операции по скипу вайтспейсес лучше использовать str_replace, так как он в 2 раза быстрее аналогичного синтаксиса с preg_replace.
2. Так как операция по скипу вайтспейсов чаще всего проводиться 1 раз на цикл (или лучше сказать, один раз на этап обработки конечной страницы), то временем задержки в 0,02 секунды можно пренебречь как незначительным.
ЗЫ. Данные тестирования я считаю важными, так как они помогают максимально оптимизировать используемые механизмы для достижения наивысшим результатов. Поэтому в дальнейшем я постараюсь их проводить как можно чаще!
