Разница в скорости при использовании встроенных строк против конкатенации в php5? - PullRequest
45 голосов
/ 17 августа 2008

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

Ответы [ 12 ]

105 голосов
/ 27 января 2009

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

Single quotes: 0.061846971511841 seconds
Double quotes: 0.061599016189575 seconds

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

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

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

Ich traue keiner Statistik, die iich nicht selbst gefälscht habe.

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

43 голосов
/ 17 августа 2008

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

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

23 голосов
/ 27 января 2009

Живые тесты:

http://phpbench.com/

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

16 голосов
/ 17 августа 2008

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

"these are " . $foo

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

'these are ' . $foo;

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

11 голосов
/ 19 августа 2008

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

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

8 голосов
/ 19 июня 2012

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

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

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

3 голосов
/ 17 сентября 2009

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

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

$a = 'parse' . $this; 

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

$a = "parse $this";

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

так что эти тесты, связанные с процессором, не раскрывают всю историю.

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

3 голосов
/ 27 января 2009

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

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

2 голосов
/ 27 января 2009

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

'parse me '.$i.' times'

чем

"parse me $i times"

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

1 голос
/ 12 октября 2012

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

$foo = "hello {$bar}";

быстрее

$foo = "hello $bar";

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

$foo = 'hello' . $bar; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...