Добрый день. Сегодня я решил узнать, что работает быстрее: 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*.
* Все приведенные значения времени в статье являются среднеарифметическим от результатов исследования.