вторник, 26 августа 2014 г.

Скорость строк в кавычках в PHP

В среде похапешников ходят легенды о том, что строки, заключённые в одинарные кавычки, "быстрее", чем строки, заключённые в двойные кавычки, так как типа на строки с двойными кавычками делает стойку интерпретатор. Я решил провести эксперимент и написал простенький скриптик:
<?php
$time = microtime(true);
$a = array();
for($i = 0; $i < 1000000; $i++)
{
    $s = < тестовая строка >;
    $a[$i] = $s;
}
echo "Time: ".ceil(1000 * (microtime(true) - $time))
    ." msec\nMemory consumption: ".ceil(memory_get_usage(true) / 1024 / 1024)." Mbytes\n";
В качестве тестовой строки я подставлял то или иное выражение, и записывал, сколько миллисекунд выполнялся скрипт, и сколько памяти пожрал. Записывал я обычно выполнение третьего-четвёртого выполнения подряд, чтоб там успело всё просраться и закешироваться, если надо. Итак, вот результаты тестов на PHP 5.4:
'qwerty asd' - 272 msec, 261 MBytes
"qwerty asd" - 272 msec, 261 MBytes
'qwerty $ asd' - 273 msec, 261 MBytes
"qwerty $ asd" - 271 msec, 261 MBytes
'qwerty $i asd' - 271 msec, 261 MBytes
"qwerty $i asd" - 427 msec, 269 MBytes - ага, вот тут интерпретатор делает стойку и вкорячивает значение переменной в строку вместо её названия. То есть только в том случае, если в строке попадается знак доллара, после которого идут буквы, только тогда строка в двойных кавычках медленнее, и то по понятной причине. Во всех остальных случаях ничего подобного. Для сравнения вариант с конкатенацией:
"qwerty asd".$i - 362 msec, 269 MBytes
Ну и напоследок я сейчас разобью сердца некоторых похапашников. Извините, ребята.
sprintf('qwerty %i asd', $i) - 563 msec, 475 MBytes
sprintf('qwerty %s asd', $i) - 664 msec, 475 MBytes

Отсюда выводы - пользоваться строками с одинарными и двойными кавычками можно как угодно, они одинаково "быстрые", вывод переменной в строке и sprintf лучше заменять конкатенацией, где можно.

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

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

Ублюдочный Гугл поломал форму комментариев. Извините.