Сегодня заполучил бесценный опыт оптимизации PHP скриптов (точнее своего фреймворка ultimix), поэтому спешу поделиться своими выводами и умозаключениями.

1. Первое что стоит помнить — PHP это интерпретируемый1 язык высокого уровня, написанный на компилируемом языке. Поэтому не переписывайте стандартные функции — они будут работать в разы, нет на порядки медленнее. Везде где только можно используйте встроенные функции. Любая собственная функция и любой собственный класс, это серьезная нагрузка на интерпретатор. Пробегая по коду, ищите места, где фрагмент кода можно заменить вызовом стандартной функции. Например вызов array_search работает быстрее чем перебор по всем элементам с помощью foreach, а перебор foreach'ем работает быстрее чем перебор с помощью for.

2. Следствие 1 из пункта 1. Везде где только можно используйте foreach вместо for. Если for заменить не получается то убедитесь что внутри него не делается лишних вычислений. Например for( $i = 0 ; $i< count( $arr ) ; $i++ ){/*некий код*/} стоит заменить2 на $c = count( $arr ); for( $i = 0 ; $i< $c ; $i++ ){/*некий код*/}

3. Следствие 2 из пункта 1. Если есть выбор между одним большим SQL запросом к базе и эквивалентной ему последовательностью маленьких, то есть веские основания предполагать что один большой запрос может стать лучшим выбором. А может и не стать.

4. Следствие 3 из пункта 1. Создавая собственные функции, не делайте их слишком универсальными. Функция должна предоставлять минимально необходимый функционал (опять таки грамотное проектирование поможет в этом). Все что вы не используете, все равно будет скомпилировано и интерпретировано.

5. Кэшируйте все что можно. Сбрасывайте данные на диск, храните их в памяти — все что угодно что приведет к росту производительности. Ознакомьтесь со средствами кэширования, предоставляемыми PHP.

6. То что вычислено один раз не должно вычисляться повторно. Найдите способ расшарить вычисленное значение между как можно большим количеством фрагментов кода.

7. Следите за тем что возвращают функции. Одно дело когда возвращается int, и совсем другое, когда возвращается массив. Избегайте сложных манипуляций с массивами. Все что можно передать по ссылке, передавайте по ссылке. Стоит задуматься о целесообразности использования функционального программирования3.

8. Грамотная архитектура поможет в оптимизации, т.к. проще оптимизировать одну функцию и использовать её везде, чем править результаты своего копипаста по всем скриптам.

9. Профайлер вам в помощь )).

    В результате всех этих действий производительность выросла более чем в 12 раз4. И это всего за один день работы. Причем не все ещё места были оптимизированы, и я уверен, что можно добиться 20-ти кратного прироста производительности.

ЗЫ Ссылки по теме:
Data-driven архитектура
Качество кода
Исключения
Организация кода
Open source убьёт мир
Фокусы с наследованием
Стандарты кодирования
Старые парадигмы о главном


1 О существовании средств, превращающих скрипты в скомпилированный байт-код сейчас речи не идет - рассматривается PHP в стандартной поставке.
2 Если, конечно, позволяет алгоритм.
3 Об этих академических вкусностях я уже писал в одной из своих предыдущих статей.
4 Стоит заметить, что я программирую вот уже 11 лет , поэтому по одному байту файлы с диска не читаю и пузырьком не сортирую. Код изначально был лишен всех этих детских болезней, однако тормозил.

Добавить комментарий


Защитный код
Обновить