How Much Is the PHPish?

Під катом представлені результати експериментальної оцінки ресурсоємності виконання коду PHP та рекомендації до написання оптимального та швидкого коду...

Версії

Производительность интерпретатора PHP (engine) ощутимо увеличивается с каждой новой версией, поэтому использование самой актуальной версии PHP - первый способ оптимизации производительности php-кода.

Конфігурація ПЗ

//tideways.com/profiler/blog/5-ways-to-increase-php-performance

Теорія оптимізації php-коду

Присвоение глобальных переменных ведет к росту используемой памяти, поэтому следует использовать функции, особенно в cron-скриптах.

Некотор Регулярные выражения работают медленней строковых функций.

Функции файловой системы выполняются быстрей при абсолютных путях.

  • !!! require быстрее, чем include для интерпретируемых файлов
    Замечание: при ветвлении алгоритма, когда есть возможность не использовать интерпретируемый файл, надо использовать include, т.к. require подключает файл всегда
  • !!! x = sizeOf($array); for($i = 0; $i < x; ++$i) {...} быстрее, чем foreach($arr as $value) {...} для не ассоциативных массивов
    Разница во времени значительна и увеличивается при увеличении массива.
  • !!! Старайтесь не использовать подавление ошибок @
    Подавление ошибок производит ряд очень медленных операций, а так как частота повтора может быть очень большой, потери скорости могут быть значительными.
  • $_SERVER[’REQUEST_TIME’] быстрее, чем time() для определения времени запуска скрипта
  • ++i быстрее, чем i++, --i быстрее, чем i--
  • повторное использование переменных быстрее, чем объявление новых
  • !!! Работа с локальными переменными быстрее, чем с глобальными, примерно, в 2 раза

 

Практика оптимізації php-коду

//

сколько стоит обработка ошибки
...в частности передача выражения по ссылке !!!

Дослідження швидкості php-конструкцій та функцій

//

Способ исследования основан на результатах вызова hrtime(true), которая возвращает время высокого разрешения в наносекундах.

Кудрявый curly-синтаксис vs Конкатенации

Выражение complex (curly) syntax
$result = "{$var1},{$var2},{$var3},{$var4},{$var5}";
выполняется быстрей строковой конкатенации
$result = $var1 . ','. $var2 . ','. $var3 . ','. $var4 . ','. $var5;
в среднем вдвое, на коротких значениях разница незначительна, но растет с увеличением длины фрагментов.

Кудрявый синтаксис vs implode()

Функция
$result = implode(',',$vars);
выполняется быстрей complex (curly) syntax
$result = "{$var1},{$var2},{$var3},{$var4},{$var5}";
от 10% и быстро растет с увеличением числа фрагментов.

Синтаксический сахар

Вопреки всем ожиданиям
$a = $a + 10;
выполняется в разы быстрей, чем
$a += 10;

Массивы

Добавление значения в массив
$a[] = 123;
выполняется быстро, как присвоение переменной.
Первое извлечение значения из массива
$b = $a[0];
выполняется ~20..50 раз дольше последующих (возможно это связано с построением дерева индексов). Последующие извлечения выполняются быстро, как при использовании переменной.

Извлечение и добавление значения в каскаде "многомерного" массива
$a[1][2][3] = 123;
$b = $a[1][2][3];
выполняется пропорционально числу каскадов, при этом первое извлечение значения из массива замедляется, как описано выше, однако это замедление не увеличивается пропорционально числу каскадов.

Ошибка выборки значения по несуществующему индексу
$b = $a[123];
выполняется в ~500 раз дольше обычной выборки, и в ~100 раз дольше, чем выражение с проверкой
$b = array_key_exists(123, $a)? $a[123] : 0;

//

Файлы

Первое чтение пустого файла 14000, затем 3500, файл 100кб увеличивает несущественно +10%

SQL

DBO

Тривиальный вызов SELECT 1; первый в 1.5 раза дольше остальные 41878.

Простой запрос чтения из таблицы первый *2 раза, остальные 113275.

Запрос простого АПДЕЙТ первый 1.6, остальные 111500. При 5-кратном увеличении каждого запроса есть эффективность 20% 448519

 

Компиляция

Оценка компиляции выполнялась путем выполнения include к тестовому файлу

Первый include пустого файла выполняется как загрузка файла 14000, остальные 5958 - компиляция +2500

При include_once первый невыполняемый инклюд в 2..3 раза выполняется дольше, чем последующие, которые требуют 500.

include '...php';
$a = <<< JSON...
с инициализацией строковой переменной значением 35KB с JSON 35KB 218291

include '....php';
$a = json_decode( <<< JSON...
309881. При 3-кратном увеличении время увеличивается пропорционально до 862211.

...из файла почти как обычное чтение 3712
$a = json_decode(file_get_contents('_test.data'));

 

Источники

  • Scooter - How Much Is The Fish (Official Video HQ) //youtu.be
  • Улучшение производительности PHP 7 //habr.com (20 Dec 2016)
  • Сборник советов и фактов по оптимизации PHP-скриптов //habr.com (25 Jan 2011)
  • John Lim: 63 Tips for speeding up your php application //gist.github.com
  • 40 советов по оптимизации вашего PHP-кода //habr.com (2 Apr 2008)
  • Оптимизация производительности PHP с помощью полных вызовов функций //phpprofi.ru

Leave a Reply