La differenza di velocità nell'utilizzo di inline stringhe vs concatenazione in php5?

StackOverflow https://stackoverflow.com/questions/13620

  •  08-06-2019
  •  | 
  •  

Domanda

(si supponga php5) considerare

<?php

    $foo = 'some words';

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

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

    //case 3
    print 'these are ' . $foo;
?>

C'è molta differenza tra 1 e 2?

Se non, che tra 1/2 e 3?

È stato utile?

Soluzione

Beh, come tutti "che Cosa potrebbe essere più veloce nella vita reale" domande, non si può battere una vera prova di vita.

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

Dare un paio di basi per pagina tutto, quindi...

0.0035568

0.0035388

0.0025394

Così, come previsto, l'interpolazione sono praticamente identici (livello di rumore differenze, probabilmente a causa dell'extra caratteri il motore di interpolazione deve gestire).Dritto fino concatenazione è di circa il 66% della velocità, che non è un grande shock.L'interpolazione parser si trova nulla a che fare, per poi finire con un semplice interno string concat.Anche se il metodo concat erano molto costosi, l'interpolatore dovrà ancora fare, dopo tutto il lavoro per analizzare la variabile e tagliare/copiare la stringa originale.

Aggiornamenti Di Somnath:

Ho aggiunto Method4() di cui sopra in tempo reale logica.

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

Quando sono solo in dichiarazione di una stringa e non solo il bisogno di analizzare la stringa troppo, quindi perché confondere PHP debugger per analizzare.Spero di avervi dato il mio punto.

Altri suggerimenti

La differenza di prestazioni è stato irrilevante almeno, dal gennaio 2012, e probabilmente in precedenza:

Single quotes: 0.061846971511841 seconds
Double quotes: 0.061599016189575 seconds

Le versioni precedenti di PHP può avere avuto una differenza: io personalmente preferisco le virgolette singole per i doppi apici, quindi è stata una conveniente differenza.La conclusione dell'articolo rende un ottimo punto:

Mai fidarsi di una statistica che non forge te.

(Anche se l'articolo cita la frase, la battuta originale era probabilmente falso attribuito Winston Churchill, inventato da Joseph Goebbels ministero della propaganda di ritrarre Churchill come un bugiardo:

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

Questo si traduce con "io non mi fido di una statistica che non ho fatto il fake di me stesso.")

Live parametri di riferimento:

http://phpbench.com/

In realtà, c'è una sottile differenza quando la concatenazione di variabili con singolo vs virgolette.

@Adamo test utilizzato

"these are " . $foo

nota che il seguito è ancora più veloce:

'these are ' . $foo;

questo è dovuto al fatto che una delle virgolette doppie "stringa" viene valutato, in cui un singolo citato 'stringa' è solo preso come è...

Non ottenere troppo presi a cercare di ottimizzare le operazioni di stringa in PHP.Concatenazione vsl'interpolazione è privo di senso (nel mondo reale le prestazioni) se le query di database sono scritti male o non si utilizza qualsiasi tipo di cache di regime.Scrivi la tua stringa di operazioni, in modo che il debug il codice in seguito sarà facile, le differenze di prestazioni sono minime.

@uberfuzzy Supponendo che questa sia solo una questione di lingua peculiarità, suppongo che va bene.Sto solo cercando di aggiungere alla conversazione che confronto di prestazioni tra apici, doppi apici e heredoc in applicazioni reali in senso rispetto alle reali prestazioni pozzi, come il povero query di database.

Eventuali differenze nel tempo di esecuzione sono del tutto trascurabile.

Si prega di consultare

Non perdere tempo su micro-ottimizzazioni come questo.Utilizzare un profiler per misurare le prestazioni dell'applicazione in uno scenario reale e quindi ottimizzare in cui è veramente necessario.Ottimizzazione di un singolo sciatta DB query è probabile che per fare un grande miglioramento delle prestazioni di applicazione di micro-ottimizzazioni in tutto il codice.

Mi sembra di ricordare che lo sviluppatore del software del forum, Vaniglia sostituito tutte le virgolette nel suo codice con apici e ho notato una quantità ragionevole di aumento delle prestazioni.

Io non riesco a rintracciare un link per la discussione al momento però.

c'è una differenza quando la concatenazione di variabili...e cosa si sta facendo con il risultato...e se ciò che si sta facendo dumping di uscita, è o non è il buffer di output in.

inoltre, qual è la situazione di memoria del server?in genere la gestione della memoria su un più alto livello di piattaforma è peggiore rispetto a quella inferiore, piattaforme...

$a = 'parse' . $this; 

è la gestione della memoria il codice utente a livello di piattaforma...

$a = "parse $this";

è la gestione della memoria in php, il codice di sistema a livello di piattaforma...

così questi parametri di riferimento relativi alla CPU non raccontano tutta la storia.

l'esecuzione di benchmark 1000 volte vs esecuzione del benchmark 1000 volte su un server che si sta tentando di eseguire la stessa simulazione 1000 volte contemporaneamente...si potrebbe ottenere drasticamente risultati diversi a seconda dell'ambito di applicazione.

Le virgolette doppie possono essere molto più lento.Ho letto da più parti che è meglio fare questo

'parse me '.$i.' times'

di

"parse me $i times"

Anche se direi che il secondo dato più leggibile il codice.

Solo per aggiungere qualcosa al mix, se si utilizza una variabile all'interno di un doppio citato stringa sintassi:

$foo = "hello {$bar}";

è più veloce

$foo = "hello $bar";

e due di questi sono più veloci rispetto

$foo = 'hello' . $bar; 

Praticamente non c'è differenza a tutti!Vedere i tempi: http://micro-optimization.com/single-vs-double-quotes

Va notato che, quando si utilizza una versione modificata dell'esempio da Adam Wright con 3 variabili, i risultati sono invertiti e le prime due funzioni sono effettivamente più veloce, in modo coerente.Questo è con 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";

Ho provato anche con '3', invece di solo il numero intero 3, ma mi da lo stesso tipo di risultati.

Con $bas = 3:

0.0016254
0.0015719
0.0019806

Con $bas = '3':

0.0016495
0.0015608
0.0022755

Va notato che questi risultati variano molto (ho variazioni di circa il 300%), ma le medie sembrano relativamente costante e quasi (in 9 casi su 10) mostra sempre una esecuzione più veloce per le prime 2 metodi, con il Metodo 2 di essere sempre leggermente più veloce rispetto al metodo 1.

In conclusione:ciò che è vero per 1 singola operazione (di interpolazione o di concatenazione) non è sempre vero per le operazioni combinate.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top