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

Ответ jQuery был очень полезен для меня. С небольшим количеством исправлений он хорошо меня удовлетворил. Я надеюсь, что это поможет кому-то еще.

function onReady ( callback ){
    var addListener = document.addEventListener || document.attachEvent,
        removeListener =  document.removeEventListener || document.detachEvent
        eventName = document.addEventListener ? "DOMContentLoaded" : "onreadystatechange"

    addListener.call(document, eventName, function(){
        removeListener( eventName, arguments.callee, false )
        callback()
    }, false )
}
46
задан Hamza Zafeer 29 April 2016 в 14:45
поделиться

8 ответов

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

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

44
ответ дан Somnath Muluk 26 November 2019 в 19:58
поделиться

Различие в производительности было не важно с тех пор, по крайней мере, январь 2012, и вероятно ранее:

Single quotes: 0.061846971511841 seconds
Double quotes: 0.061599016189575 seconds

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

Никогда не доверяют статистической величине Вы, didn’t создают себя.

(Хотя статья заключает фразу в кавычки, исходное тонкое замечание было вероятно ложно , приписал Winston Churchill, изобретенному министерством пропаганды Joseph Goebbels' для описания Churchill как лгуна:

Ich traue keiner Statistik, умрите ich nicht selbst gefГ¤lscht habe.

Это свободно переводит в, "Я не доверяю статистической величине, которую я не фальсифицировал сам".)

105
ответ дан 5 revs, 3 users 71% 26 November 2019 в 19:58
поделиться

Живые сравнительные тесты:

http://phpbench.com/

существует на самом деле тонкое различие при конкатенации переменных с синглом по сравнению с двойными кавычками.

23
ответ дан Mike B 26 November 2019 в 19:58
поделиться

тест @Adam использовал

"these are " . $foo

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

'these are ' . $foo;

это происходит из-за того, что двойная заключенная в кавычки "строка" оценена, где единственная заключенная в кавычки 'строка' просто взята, как...

16
ответ дан Pierre Spring 26 November 2019 в 19:58
поделиться

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

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

11
ответ дан Jake McGraw 26 November 2019 в 19:58
поделиться

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

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

3
ответ дан navitronic 26 November 2019 в 19:58
поделиться

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

'parse me '.$i.' times'

, чем

"parse me $i times"

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

2
ответ дан KJYe.Name 葉家仁 26 November 2019 в 19:58
поделиться

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

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

$a = 'parse' . $this; 

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

$a = "parse $this";

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

поэтому эти тесты, относящиеся к процессору, не раскрывают всей истории.

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

3
ответ дан 26 November 2019 в 19:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: