Оптимизация PHP
Недавно занялся трассировкой кода, дабы найти “бутылочные горлышки” и был очень удивлён и обескуражен от результатов. Итак по порядку.
- Первое оказалось вполне логично это функции, любой вызов функции зло. А значит использование таких функций как array_push($a, ‘hi’) лучше заменять на конструкцию типа $a[] = ‘hi’; работает в несколько раз быстрее, раза в 3. Тоже касается про всякие функции типа is_null. Что эе касается функции empty то её лучше вообще не использовать, если это реально не необходимость. Она проверяет на null, false, пустую строку и 0. А вот что меня удивило так это функция define я всегда пологал что это мета-функция и не является реальной функцией, но по трейсам видно, что это происходит реальный вызов функции. Тоже можно сказать и с echo пусть это не эстетично, но лучше вставить “?>” “<?php” чем пару раз echo. Но echo быстрее чем print, так как не возвращает результат.
- “Переменные в строках”, красиво использовать конструкции типа
echo "Hello {$name}";
но как правило это работает значительно медленнее, чем echo 'Hello '.$name;
или даже так echo 'Hello ', $name;
что освобождает интерпритатор от конкатинации строк.
- Ещё одной темой была функция foreach она работает медленнее чем циклы for или while. Говорят проблема в том, что создаётся копия массива, и это можно обойти с помощью передачи по ссылке
foreach ($arr as $k => &$v) { ... }
- preg* работают почти всегда намного быстрей чем ereg
- Если вы используете кеширование промежуточного кода, как например APC, и используете include($filename), а именно паередавая переменную в качестве аргумента функции include, то этот include а памяти не будет кэшироваться. Может это и специфика моей версии APC, если что, дайте знать :-) А то так, что паттерн Factory, что тупо autoload идёт на смарку.
- и напоследок, никогда не изобретайте велосипеды, используйте встроенные функции языка