Страницы

Поиск по вопросам

среда, 12 декабря 2018 г.

PHP двойная или одинарная кавычка и конкатенация - что быстрее

Для того, чтобы собрать строку можно использовать два варианта. Первый с помощью двойных кавычек (данные парсятся) например:
$text = "Здесь любой текст и переменная $test";
Или второй вариант с помощью конкатенации:
$text = 'Здесь любой текст и переменная '.$test;
Какой вариант будет работать быстрее? И зависит ли разница в скорости от количества переменных в строке? Просто услышал мнение, что конкатенация занимает больше времени. Хочется услышать мнение экспертов.


Ответ

раз уже вчера с @АлексейШиманский затронули тесты, а @StackOverflow поделился ссылкой на древнюю как динозавры статью с какими то тестами от 2008 года, то решил проверить один из этих тестов в 2017м. Железо почти из той же эпохи i7-980x и 10 ГБайт памяти в наличии win10х64, Open Server, проверяем на пхп 5.6 и 7.0.22.
запуск тестовых функций несколько переписан.
for($i = 1; $i <= 4;$i++){
$f = "quotes_$i"; $ts = microtime(true);
call_user_func($f, $_1, $_2, $_3, $_4, $_5, $_iterator);
$time = microtime(true) - $ts; print "$f - $time
"; }
тестируются 4 функции, в каждой по 5 млн итераций, в строку подставляется 5 переменных:
подстановка в строки вида "qwe $var asd" подстановка в строки вида "qwe {$var} asd" конкатенация с одинарными кавычками 'qwe'.$var.'asd' использование sprintf
для пхп 5.6х32 результаты следующие (5 запусков, средний):
1. 4,143 сек 2. 3,827 сек 3. 6,866 сек 4. 12,378 сек
при запуске в консоли результат в аналогичный.
для пхп 5.6х64 время несколько увеличивается (здесь и далее по 3 запуска, средний)
1. 4,198 сек 2. 4,182 сек 3. 8,646 сек 4. 12,572 сек
При переходе на пхп 7.х ситуация кардинально меняется
1. 1,625 сек 2. 1,612 сек 3. 2,862 сек 4. 13,886 сек
в отличие от 5.6 для пхп 7.х х64 наблюдается ускорение
1. 1,149 сек 2. 1,156 сек 3. 2,871 сек 4. 12,143 сек
отсюда выводы:
вызов функции форматирвоания sprintf очевидный аутсайдер, и это понятно, т.к. переключение стека и т.п. тоже требует приличных ресурсов. х64 версия для 5.6. работает несколько дольше, чем х32, хотя в случае пхп 7.х ситуация обратная и выигрывает х64 вариант. вариант с конкатенацией всегда проигрывает варианту с подстановкой в строку, и если для пхп 5.6 в 1.5-2 раза, то для пхп 7 в 2 раза и более. в пхп 7. варианты 1 и 2 подставноки в строку в двойных кавычках идентичны по скорости, хотя в 5.6 первый несколько проигрывал. пхп 7 в 2.5-3.5 раза быстрее в данных операциях чем 5.6.

Комментариев нет:

Отправить комментарий