Różnica prędkości w używaniu ciągów inline vs concatenation w php5?

(assume php5) consider

<?php

    $foo = 'some words';

    //case 1
    print "these are $foo";

    //case 2
    print "these are {$foo}";

    //case 3
    print 'these are ' . $foo;
?>
Czy istnieje duża różnica między 1 A 2? Jeśli nie, to co z 1/2 do 3?
Author: Hamza Zafeer, 2008-08-17

12 answers

Cóż, jak w przypadku wszystkich pytań "co może być szybsze w prawdziwym życiu", nie można pokonać prawdziwego testu.

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";

Daj mu kilka runów, aby Strona wszystko w, Następnie...

0.0035568

0.0035388

0.0025394

Tak więc, zgodnie z oczekiwaniami, interpolacja jest praktycznie identyczna (różnice poziomu szumów, prawdopodobnie ze względu na Dodatkowe znaki, które silnik interpolacji musi obsługiwać). Prosta konkatenacja wynosi około 66% prędkości, co nie jest wielkim szokiem. Na Parser interpolacji będzie szukał, nie znajdzie nic do zrobienia, a następnie zakończy się prostym wewnętrznym ciągiem concat. Nawet jeśli concat był drogi, interpolator nadal będzie musiał to zrobić, po całej pracy, aby przetworzyć zmienną i przyciąć / skopiować oryginalny ciąg znaków.

Aktualizacje Przez Somnath:

Dodałem Method4 () do powyższej logiki czasu rzeczywistego.

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

Jeśli deklarujesz tylko ciąg znaków i nie musisz go analizować, to po co mylić PHP debugger do analizy. Mam nadzieję,że rozumiesz.

 42
Author: Adam Wright,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-26 12:28:53

Różnica w wydajności jest nieistotna od co najmniej stycznia 2012 roku, a prawdopodobnie wcześniej:

Single quotes: 0.061846971511841 seconds
Double quotes: 0.061599016189575 seconds

Wcześniejsze wersje PHP mogły mieć różnicę - osobiście wolę pojedyncze cudzysłowy od podwójnych, więc była to wygodna różnica. Wniosek z artykułu stanowi doskonały punkt:

Nigdy nie ufaj statystykom, których nie sfałszowałeś.

(chociaż artykuł cytuje frazę, oryginalny dowcip był prawdopodobnie fałszywy Winstona Churchilla, wymyślonego przez Ministerstwo propagandy Josepha Goebbelsa, aby przedstawić Churchilla jako kłamcę:]}

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

To luźno tłumaczy się: "nie ufam statystyce, której nie udawałem.")
 104
Author: Paolo Bergantino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-29 11:28:12

Live benchmarki:

Http://phpbench.com/

Istnieje subtelna różnica podczas łączenia zmiennych z cudzysłowami pojedynczymi i podwójnymi.

 23
Author: Mike B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-27 04:08:03

@Adam ' s test used

"these are " . $foo

Zauważ, że następujące czynności są jeszcze szybsze:

'these are ' . $foo;

Wynika to z faktu, że podwójny cytowany "string" jest oceniany, gdzie pojedynczy cytowany "string" jest brany tak, jak jest...

 16
Author: Pierre Spring,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-17 15:44:57

Nie daj się pochłonąć próbom optymalizacji operacji ciągów w PHP. Konkatenacja a interpolacja jest bez znaczenia (w rzeczywistości), jeśli zapytania do bazy danych są źle napisane lub nie używasz żadnego schematu buforowania. Zapisz swoje operacje ciągów w taki sposób, aby późniejsze debugowanie kodu było łatwe, a różnice w wydajności są znikome.

@uberfuzzy zakładając, że to tylko pytanie o minutię językową, myślę, że jest w porządku. Staram się tylko Dodaj do rozmowy, że porównywanie wydajności między pojedynczym cytatem, podwójnym cytatem i heredoc w rzeczywistych aplikacjach w porównaniu do rzeczywistych zleceń wydajności, takich jak słabe zapytania do bazy danych.

 11
Author: Jake McGraw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-19 13:44:12

Wszelkie różnice w czasie wykonania są całkowicie znikome.

Zobacz

Nie trać czasu na takie mikro-optymalizacje. Użyj profilera, aby zmierzyć wydajność aplikacji w rzeczywistym scenariuszu, a następnie zoptymalizować miejsce, w którym ona działa jest naprawdę potrzebny. Optymalizacja pojedynczego niechlujnego zapytania DB prawdopodobnie spowoduje większą poprawę wydajności niż stosowanie mikro-optymalizacji w całym kodzie.

 8
Author: Gordon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-19 18:27:54

Wydaje mi się, że pamiętam, że twórca oprogramowania forum, Vanilla zastąpił wszystkie podwójne cytaty w swoim kodzie pojedynczymi cytatami i zauważył rozsądny wzrost wydajności.

W tej chwili nie mogę wyśledzić linku do dyskusji.

 3
Author: navitronic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-27 03:22:48

Istnieje różnica przy łączeniu zmiennych... i co robisz z wynikiem... a jeśli to, co robisz, wyrzuca go do wyjścia, jest lub nie jest włączone buforowanie wyjścia.

Ponadto, jaka jest sytuacja pamięci serwera? zazwyczaj zarządzanie pamięcią na platformie wyższego poziomu jest gorsze niż na platformach niższych...

$a = 'parse' . $this; 

Zarządza pamięcią na poziomie platformy kodu użytkownika...

$a = "parse $this";

Zarządza pamięcią na platformie kodu systemu php poziom...

Więc te benchmarki jako ZWIĄZANE Z CPU nie mówią całej historii.

Uruchamianie benchmarka 1000 razy w porównaniu z uruchamianiem benchmarka 1000 razy na serwerze, który próbuje uruchomić tę samą symulację 1000 razy jednocześnie... możesz uzyskać drastycznie różne wyniki w zależności od zakresu aplikacji.

 3
Author: kjy112,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-09 15:53:29

Podwójne cudzysłowy mogą być znacznie wolniejsze. Czytałem z kilku miejsc, że lepiej jest to zrobić

'parse me '.$i.' times'

Niż

"parse me $i times"
Chociaż powiedziałbym, że drugi dał ci bardziej czytelny kod.
 2
Author: kimsk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-09 15:53:40

Praktycznie nie ma żadnej różnicy! Zobacz terminy: http://micro-optimization.com/single-vs-double-quotes

 1
Author: Klerk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-27 22:10:33

Aby dodać coś innego do miksu, jeśli używasz zmiennej wewnątrz składni podwójnego cytowanego ciągu znaków:

$foo = "hello {$bar}";

Jest szybszy niż

$foo = "hello $bar";

I oba są szybsze niż

$foo = 'hello' . $bar; 
 1
Author: Rob Forrest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-08 17:23:54

Należy zauważyć, że przy użyciu zmodyfikowanej wersji przykładu Adama Wrighta z 3 zmiennymi, wyniki są odwrócone, a dwie pierwsze funkcje są rzeczywiście szybsze, konsekwentnie. To jest z PHP 7.1 na 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";

Próbowałem również z '3' zamiast tylko liczby całkowitej 3, ale otrzymuję ten sam rodzaj wyników.

Z $bas = 3:

0.0016254
0.0015719
0.0019806

With $bas = '3':

0.0016495
0.0015608
0.0022755

Należy zauważyć, że wyniki te bardzo się różnią (dostaję odmiany o 300%), ale średnie wydają się stosunkowo stabilne i prawie (9 z 10 przypadków) zawsze pokazują szybszą realizację dla 2 pierwszych metod, przy czym Metoda 2 zawsze jest nieco szybsza niż metoda 1.

Podsumowując: to, co jest prawdą dla jednej operacji (czy to interpolacja czy konkatenacja), nie zawsze jest prawdą dla Operacji Połączonych.

 0
Author: ywarnier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-26 04:56:08