(предположим, что php5) считают
<?php $foo = 'some words'; //case 1 print "these are $foo"; //case 2 print "these are {$foo}"; //case 3 print 'these are ' . $foo; ?>
Есть ли разница между 1 и 2?
Если нет, то между 1/2 и 3?
Ну, как и во всех вопросах «Что может быть быстрее в реальной жизни», вы не можете обыграть тест на жизнь.
function timeFunc($function, $runs) { $times = array(); for ($i = 0; $i < $runs; $i++) { $time = microtime(); call_user_func($function); $times[$i] = microtime() - $time; } return array_sum($times) / $runs; } function Method1() { $foo = 'some words'; for ($i = 0; $i < 10000; $i++) $t = "these are $foo"; } function Method2() { $foo = 'some words'; for ($i = 0; $i < 10000; $i++) $t = "these are {$foo}"; } function Method3() { $foo = 'some words'; for ($i = 0; $i < 10000; $i++) $t = "these are " . $foo; } print timeFunc('Method1', 10) . "\n"; print timeFunc('Method2', 10) . "\n"; print timeFunc('Method3', 10) . "\n";
Дайте ему несколько прогонов, чтобы перечислить все, а затем …
0.0035568
0.0035388
0.0025394
Таким образом, как и ожидалось, интерполяция практически идентична (различия уровня шума, возможно, из-за дополнительных символов, которые должен обрабатывать механизм интерполяции). Прямая конкатенация составляет около 66% скорости, что не вызывает большого шока. Интерполяционный парсер будет выглядеть, ничего не поделать, а затем завершить с помощью простой внутренней строки concat. Даже если concat был дорогим, интерполятору все равно придется это сделать, после всей работы по разборке переменной и отделке / копированию исходной строки.
Обновления от Somnath:
Я добавил Method4 () в логику реального времени.
function Method4() { $foo = 'some words'; for ($i = 0; $i < 10000; $i++) $t = 'these are ' . $foo; } print timeFunc('Method4', 10) . "\n"; Results were: 0.0014739 0.0015574 0.0011955 0.001169
Когда вы просто объявляете только строку и не нуждаетесь в синтаксическом анализе этой строки, то зачем путать отладчик PHP для разбора. Надеюсь, ты понял.
Разница в производительности была неактуальной с по крайней мере с января 2012 года и, вероятно, раньше:
Single quotes: 0.061846971511841 seconds Double quotes: 0.061599016189575 seconds
Ранние версии PHP, возможно, имели значение – я лично предпочитаю одинарные кавычки для двойных кавычек, так что это была удобная разница. Заключение статьи дает отличную оценку:
Никогда не доверяйте статистике, которую вы не подделывали.
(Хотя в статье цитируется фраза, оригинальная шутка, вероятно, ложно отнесена к Уинстону Черчиллю, изобретенному службой пропаганды Иосифа Геббельса, чтобы изобразить Черчилля как лжеца:
Ich traue keiner Statistik, die ich nicht selbst gefälscht habe.
Это свободно переводит: «Я не доверяю статистике, что я не подделывал себя».)
Текущие тесты:
На самом деле существует тонкая разница при объединении переменных с одиночными или двойными кавычками.
@ Тест Адама
"these are " . $foo
обратите внимание на следующее:
'these are ' . $foo;
это связано с тем, что вычисляется двойная кавычка «строка», где только одна строка «строка» используется только как …
Не пытайтесь оптимизировать строковые операции в PHP. Конкатенация против интерполяции бессмысленна (в реальном мире), если ваши запросы к базе данных плохо написаны или вы не используете какую-либо схему кэширования. Напишите свои строковые операции таким образом, чтобы отладка кода позже была простой, различия в производительности незначительны.
@uberfuzzy Предполагая, что это всего лишь вопрос о языке minutia, я полагаю, все в порядке. Я просто пытаюсь добавить к разговору, что сравнение производительности между одиночной кавычкой, двойной кавычкой и heredoc в приложениях реального мира бессмысленно по сравнению с реальными поглотителями производительности, например, с низкими запросами базы данных.
Любые различия во времени выполнения совершенно ничтожны.
Пожалуйста, посмотри
Не тратьте время на такие микро-оптимизации. Используйте профилировщик для измерения производительности вашего приложения в реальном мире, а затем оптимизируйте, где это действительно необходимо. Оптимизация единого sloppy-запроса БД, вероятно, приведет к увеличению производительности, чем применение микро-оптимизаций по всему вашему коду.
Я, кажется, помню, что разработчик программного обеспечения форума Vanilla заменил все двойные кавычки в своем коде одиночными кавычками и заметил разумное увеличение производительности.
На данный момент я не могу найти ссылку на дискуссию.
существует разница при объединении переменных … и то, что вы делаете с результатом … и если то, что вы делаете, это сброс его на вывод, является или не выводит буферизацию.
также, какова ситуация с памятью сервера? обычно управление памятью на платформе более высокого уровня хуже, чем на более низких платформах …
$a = 'parse' . $this;
управляет памятью на уровне платформы пользовательского кода …
$a = "parse $this";
управляет памятью на уровне платформы php system code …
поэтому эти тесты, связанные с ЦП, не рассказывают всю историю.
запуск теста в 1000 раз против запуска теста 1000 раз на сервере, который пытается запустить такое же моделирование 1000 раз одновременно … вы можете получить совершенно разные результаты в зависимости от области применения.
Двойные кавычки могут быть намного медленнее. Я читал из нескольких мест, что лучше сделать это
'parse me '.$i.' times'
чем
"parse me $i times"
Хотя я бы сказал, что второй дал вам более читаемый код.
Практически нет никакой разницы! См. Тайминги: http://micro-optimization.com/single-vs-double-quotes.
Просто добавьте что-то еще в микс, если вы используете переменную внутри синтаксиса с двойной кавычкой:
$foo = "hello {$bar}";
быстрее, чем
$foo = "hello $bar";
и оба они быстрее, чем
$foo = 'hello' . $bar;
Следует отметить, что при использовании модифицированной версии примера Адама Райта с 3 переменными результаты меняются на противоположные и первые две функции выполняются быстрее, последовательно. Это с PHP 7.1 на CLI:
function timeFunc($function, $runs) { $times = array(); for ($i = 0; $i < $runs; $i++) { $time = microtime(); call_user_func($function); @$times[$i] = microtime() - $time; } return array_sum($times) / $runs; } function Method1() { $foo = 'some words'; $bar = 'other words'; $bas = 3; for ($i = 0; $i < 10000; $i++) $t = "these are $foo, $bar and $bas"; } function Method2() { $foo = 'some words'; $bar = 'other words'; $bas = 3; for ($i = 0; $i < 10000; $i++) $t = "these are {$foo}, {$bar} and {$bas}"; } function Method3() { $foo = 'some words'; $bar = 'other words'; $bas = 3; for ($i = 0; $i < 10000; $i++) $t = "these are " . $foo . ", " . $bar . " and " .$bas; } print timeFunc('Method1', 10) . "\n"; print timeFunc('Method2', 10) . "\n"; print timeFunc('Method3', 10) . "\n";
Я также пробовал использовать «3» вместо целого числа 3, но получаю такие же результаты.
При $ bas = 3:
0.0016254 0.0015719 0.0019806
С $ bas = '3':
0.0016495 0.0015608 0.0022755
Следует отметить, что эти результаты сильно различаются (я получаю вариации около 300%), но средние значения кажутся относительно устойчивыми и почти (9 из 10 случаев) всегда показывают более быстрое выполнение для двух первых методов, причем метод 2 всегда является немного быстрее, чем метод 1.
В заключение: то, что верно для одной единственной операции (будь то интерполяция или конкатенация), не всегда верно для комбинированных операций.