Разница в скорости при использовании встроенных строк против конкатенации в 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?

17.08.2008 13:19:32
Обратите внимание, что echo 'these are ', $foo;это быстрее, чем любой из них, поскольку нет конкатенации или интерполяции.
Paul 4.01.2012 22:25:02
Почему этот вопрос не является конструктивным?
Chris Harrison 23.07.2014 11:05:38
Без понятия. Это был действительно начальный вопрос, добавленный вскоре после запуска сайта, когда бета-версиям предлагалось публиковать базовые вопросы, которые возникнут в ранних поисках в Google, даже если они слишком просты для вопроса или граничат с форма вопроса. Учитывая мнения и активность комментариев и голосования в них, я бы сказал, что это было довольно конструктивно, imho.
Uberfuzzy 23.07.2014 14:57:01
Пожалуйста, смотрите мой ответ на другой вопрос, где эта проблема появилась в комментариях: stackoverflow.com/a/31312867/2893496
v010dya 9.07.2015 10:00:08
Одиночные кавычки быстрее в моем сценарии. Я запускаю асинхронные парсеры журналов, используя параллель, прирост производительности ЦП дал мне возможность запускать больше парсеров параллельно. Одиночные кавычки я могу разобрать 144TB / час, двойные кавычки я могу разобрать менее 95TB. Но вам нужно будет проверить это только тогда, когда вы уже сделали все, что могли === вместо ==, сравнение строк вместо регулярных выражений и множество других.
Diogo Paim 23.12.2015 04:03:54
12 ОТВЕТОВ
РЕШЕНИЕ

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

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 был дорогим, интерполятору все равно придется это делать, после всей работы по анализу переменной и обрезке / копированию исходной строки.

Обновления Сомнатх:

Я добавил 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-отладчик с анализом. Я надеюсь, вы поняли мою точку зрения.

44
26.02.2015 12:28:53
Конечно, вы не можете пройти испытание в реальной жизни. Но этот искусственный Франкенштейн не имеет ничего общего с реальными условиями жизни.
Your Common Sense 16.03.2012 10:04:04
Те скептики, которые пытаются воспроизвести эти результаты (как я ;-) на PHP5 +, меняют microtime()вызовы на microtime(true)- вы хотите, чтобы время было плавающим, а не какой-то странной строкой.
Erwin Wessels 3.05.2013 05:14:40
Добавлен Method4 () для обработки строк. И я думаю, что обработка PHP теперь стала быстрее. @AdamWright
Somnath Muluk 26.02.2015 12:29:18
Привет. Ваше сравнение предполагает, что в строке есть только один экземпляр переменной. Пожалуйста, смотрите stackoverflow.com/a/31312867/2893496
v010dya 9.07.2015 10:00:48
Это смущает меня: «около 66% скорости», не правда ли, «около 66% времени»? Я думал, что конкатенация быстрее?
datasn.io 8.11.2015 12:27:10

@ Тест Адама используется

"these are " . $foo

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

'these are ' . $foo;

это связано с тем, что вычисляется двойная кавычка "строка", где единственная кавычка "строка" просто берется как есть ...

16
17.08.2008 15:44:57
Я только что провел небольшое быстрое тестирование, и между этими двумя показателями нет особой экономии - разумеется, это далеко не так сильно, как изменение интерполяции на конкатенацию, - но одинарные кавычки быстрее.
Colonel Sponsz 27.11.2009 16:54:10

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

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

11
19.08.2008 13:44:12

Разница в производительности не имеет значения по крайней мере с января 2012 года и, вероятно, раньше:

Single quotes: 0.061846971511841 seconds
Double quotes: 0.061599016189575 seconds

Ранние версии PHP могли иметь разницу - лично я предпочитаю одинарные кавычки двойным кавычкам, так что это было удобное отличие. Заключение статьи делает превосходное замечание:

Никогда не доверяйте статистике, которую вы сами не подделали.

(Хотя в статье цитируется эта фраза, первоначальный шут, вероятно, был ложно приписан Уинстону Черчиллю, изобретенному пропагандистским министерством Джозефа Геббельса, чтобы изобразить Черчилля как лжеца:

Ich traue keiner Statistik, Die Nicht Selbst Gefälscht habe.

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

105
29.06.2016 11:28:12
Разве это не просто проверка во время компиляции?
Kyle Cronin 27.01.2009 03:03:17
Кроме того, используя меньше пикселей, вы сокращаете выбросы парниковых газов.
paxdiablo 27.01.2009 03:32:09
На самом деле, поскольку более быстрые вычисления означают меньше процессорного времени и меньше потребляемой мощности, одиночные кавычки действительно сокращают выбросы парниковых газов.
Crashworks 27.01.2009 04:28:14
@ Паоло Бегантино: у тебя есть доказательства? phpbench.com уважительно не согласен с вами каждый раз, когда я загружаю его.
A. Rex 27.01.2009 05:27:31
Обратите внимание, что даже если вы используете строку в одинарных кавычках, PHP все еще анализирует каждый символ в нем, чтобы найти escape-последовательности и т. Д. PHP также анализирует весь файл , так что в лучшем случае вы по-прежнему смотрите на O ( о) для длины строки.
duma 19.01.2011 16:58:25

Кажется, я помню, что разработчик программного обеспечения форума, Vanilla, заменил все двойные кавычки в своем коде одинарными кавычками и заметил разумное увеличение производительности.

Хотя сейчас я не могу найти ссылку на обсуждение.

3
27.01.2009 03:22:48

Живые тесты:

http://phpbench.com/

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

23
27.01.2009 04:08:03
Я думаю, что это зависит от конфигурации оборудования и скомпилированного php.
FDisk 17.10.2011 08:32:25
Я не знал, что вы можете использовать запятую в эхо вместо точки.
Buttle Butkus 3.01.2013 09:33:46

Двойные кавычки могут быть намного медленнее. Я читал из нескольких мест, что это лучше сделать

'parse me '.$i.' times'

чем

"parse me $i times"

Хотя я бы сказал, что второй дал вам более читаемый код.

1
9.04.2011 15:53:40
Нет, по моему опыту работы с чужим кодом, первый гораздо более читабелен.
staticsan 21.05.2009 04:02:01
@staticsan, просто сделай себе хороший редактор с подсветкой синтаксиса, чувак.
Your Common Sense 9.04.2011 16:31:07
Я сделать использовать подсветку синтаксиса редактора. Подсветка работает намного лучше с первым вариантом.
staticsan 12.04.2011 02:02:35
Редактор PhpStorm хорошо работает с подсветкой на обоих примерах.
FDisk 17.10.2011 08:34:00
I read from several places- Какие места? Пожалуйста, предоставьте документацию.
user2954463 2.12.2019 22:18:28

есть разница при объединении переменных ... и о том, что вы делаете с результатом ... и если то, что вы делаете, это выдает его на выход, включена или нет буферизация на выходе.

Кроме того, какова ситуация с памятью на сервере? как правило, управление памятью на платформе более высокого уровня хуже, чем на платформах более низкого уровня ...

$a = 'parse' . $this; 

управляет памятью на уровне платформы пользовательского кода ...

$a = "parse $this";

управляет памятью на уровне платформы кода системы php ...

таким образом, эти тесты, связанные с процессором, не дают полной информации.

1000-кратное выполнение теста по сравнению с 1000-кратным выполнением теста на сервере, который пытается выполнить одно и то же моделирование 1000 раз одновременно ... вы можете получить радикально разные результаты в зависимости от области применения приложения.

3
9.04.2011 15:53:29
Плюс 1 за «обычно управление памятью на платформе более высокого уровня хуже, чем на платформах более низкого уровня ...»
Hamid Sarfraz 1.01.2013 02:43:06

Практически разницы нет вообще! Смотрите сроки: http://micro-optimization.com/single-vs-double-quotes

0
27.05.2011 22:10:33

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

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

Не тратьте время на микрооптимизации, подобные этой. Используйте профилировщик для измерения производительности вашего приложения в реальном сценарии, а затем оптимизируйте его там, где это действительно необходимо. Оптимизация одного неаккуратного запроса к БД, вероятно, приведет к большему повышению производительности, чем применение микрооптимизаций во всем коде.

8
19.06.2012 18:27:54
Аминь! Я заметил, что в разных языковых сообществах оцениваются разные вещи, и выполнение одиночных кавычек кажется священной коровой мира PHP.
iconoclast 15.08.2012 22:25:57

Просто чтобы добавить что-то еще в микс, если вы используете переменную внутри синтаксиса строки в двойных кавычках:

$foo = "hello {$bar}";

быстрее чем

$foo = "hello $bar";

и оба они быстрее, чем

$foo = 'hello' . $bar; 
1
8.02.2013 17:23:54

Следует отметить, что при использовании модифицированной версии примера Адамом Райтом с 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.

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

0
26.04.2017 04:56:08
Интересно, сколько из этого от переворота, и сколько было оптимизаций в php7. Оригинальный вопрос был конкретным, чтобы упомянуть контекст php5.
Uberfuzzy 29.04.2017 01:07:12