Сравнение производительности strtr, str_replace, preg_replace

Добрый день. Сегодня я решил узнать, что работает быстрее: strtr, str_replace или же preg_replace. Для ленивых: str_replace — самая быстрая функция, на втором месте preg_replace, а уж strtr совсем медленная.

Суть теста.

Замена подстрок запускается в цикле 100000 (сто тысяч) раз.

$str = 'Это невероятно {tag1} история. Она повествует о том как {tag1} женщина разыграла сцену на {tag2}.';$a = null;for ($i = 0; $i < 100000; $i++) {  //$a = strtr($str, array('{tag1}' => $i, '{tag2}' => $i . $i)); //$a = preg_replace('|\{tag1\}|', $i, $str);    //$a = preg_replace('|\{tag2\}|', $i . $i, $str);       //$a = str_replace(array('{tag1}', '{tag2}'), array($i, $i . $i), $str);}

 

Результаты.

Тест выполнялся в виртуальной машине.
Ubuntu Server 12.04 x64, 4 vCPU, 2.0 GHz, Guaranteed CPU 20%, DDR3 ECC RAM
1333 MHz 4Gb.
PHP 5.4.6-2~precise+1

Тестирование проводилось через веб сервер (nginx+apache) и напрямую из интерпретатора (php -f test.php)

  • strtr — 0.45s*
  • preg_replace- 0.28s*
  • str_replace — 0.14s*

Ещё один момент. В документации strtr написано:

Однако, стоит учесть тот факт, что эта функция максимально эффективна в том случае, если все ключи имеют одинаковый размер.

Так что если мы заменим tag2 на tag22 (например), то время выполнения скрипта увеличится до 0.65s*.


* Все приведенные значения времени в статье являются среднеарифметическим от результатов исследования.