Разница в скорости при использовании встроенных строк против конкатенации в php5?

(предположим, что 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?

Solutions Collecting From Web of "Разница в скорости при использовании встроенных строк против конкатенации в php5?"

Ну, как и во всех вопросах «Что может быть быстрее в реальной жизни», вы не можете обыграть тест на жизнь.

 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.

Это свободно переводит: «Я не доверяю статистике, что я не подделывал себя».)

Текущие тесты:

http://phpbench.com/

На самом деле существует тонкая разница при объединении переменных с одиночными или двойными кавычками.

@ Тест Адама

 "these are " . $foo 

обратите внимание на следующее:

 'these are ' . $foo; 

это связано с тем, что вычисляется двойная кавычка «строка», где только одна строка «строка» используется только как …

Не пытайтесь оптимизировать строковые операции в PHP. Конкатенация против интерполяции бессмысленна (в реальном мире), если ваши запросы к базе данных плохо написаны или вы не используете какую-либо схему кэширования. Напишите свои строковые операции таким образом, чтобы отладка кода позже была простой, различия в производительности незначительны.

@uberfuzzy Предполагая, что это всего лишь вопрос о языке minutia, я полагаю, все в порядке. Я просто пытаюсь добавить к разговору, что сравнение производительности между одиночной кавычкой, двойной кавычкой и heredoc в приложениях реального мира бессмысленно по сравнению с реальными поглотителями производительности, например, с низкими запросами базы данных.

Любые различия во времени выполнения совершенно ничтожны.

Пожалуйста, посмотри

  • Блог NikiC: опровержение мифа о производительности Single Quotes для технического объяснения того, как интерполяция и конкатенация работают на PHP и почему совершенно бессмысленно заботиться о своей скорости.

Не тратьте время на такие микро-оптимизации. Используйте профилировщик для измерения производительности вашего приложения в реальном мире, а затем оптимизируйте, где это действительно необходимо. Оптимизация единого 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.

В заключение: то, что верно для одной единственной операции (будь то интерполяция или конкатенация), не всегда верно для комбинированных операций.