Perché === è più veloce di == in PHP?


168

Perché è ===più veloce che ==in PHP?


40
È più veloce, ma è significativamente più veloce?
Piskvor lasciò l'edificio l'

19
Per favore, non leggere cosa c'è di più veloce in php. Leggi come ottenere dati interessanti in una singola query SQL senza abusare di JOIN.
Kamil Szot

15
A chi potrebbe essere interessato al medesimo soggetto === vs ==, ma in JavaScript, può leggere qui: stackoverflow.com/questions/359494/...
Marco Demaio

5
@Piskvor, non è questa la domanda
Pacerier il

6
@Pacerier: punto giusto - ecco perché ho solo commentato questo. Non risponde alla domanda, ma fornisce una prospettiva al riguardo.
Piskvor lasciò l'edificio il

Risposte:


200

Poiché l'operatore di uguaglianza ==obbliga o converte il tipo di dati temporaneamente per vedere se è uguale all'altro operando, mentre ===(l'operatore di identità) non ha bisogno di fare alcuna conversione e quindi si fa meno lavoro, il che lo rende più veloce.


Penso che la tua opinione sia contraria a quanto afferma il Manuale PHP. Dicono che $ a == $ b sia VERO se $ a è uguale a $ b, dove $ a === $ b è VERO se $ a è uguale a $ b, e sono dello stesso tipo.
Bakhtiyor,

92
Come è contrario, allora?
meder omuraliev,

2
Credo che in realtà i 2 operandi puntino alla stessa area di memoria per tipi complessi, ma la risposta del mediatore comprende che
Basic

1
Ha senso (come è in JS), ma sarebbe bello se qualcuno aggiungesse anche un riferimento ad alcuni test di prestazioni davvero semplici.
Marco Demaio,

4
phpbench.com ha un'indicazione della differenza di prestazioni tra == e === nella sezione "Strutture di controllo".
ekillaby,

54

===non esegue la tipografia, quindi 0 == '0'valuta true, ma 0 === '0'- a false.


25

Innanzitutto, === verifica se i due argomenti sono dello stesso tipo , quindi il numero 1 e la stringa '1' non riescono sul controllo del tipo prima che vengano effettivamente eseguiti confronti. D'altra parte, == non controlla prima il tipo e va avanti e converte entrambi gli argomenti nello stesso tipo e quindi fa il confronto.

Pertanto, === è più veloce nel verificare una condizione di errore


8
Immagino che ==controlla anche il tipo prima di vedere se è necessario eseguire una conversione di tipo. Il fatto che ===non esegua alcuna conversione nel passaggio seguente è ciò che lo rende più veloce.
ingannare

25

Ci sono due cose da considerare:

  1. Se tipi di operandi sono diversi quindi ==e ===producono risultati diversi . In tal caso la velocità degli operatori non ha importanza; ciò che conta è quale produce il risultato desiderato.

  2. Se i tipi di operando sono uguali, è possibile utilizzare uno dei due ==o ===entrambi producono gli stessi risultati . In tal caso la velocità di entrambi gli operatori è quasi identica. Questo perché nessuna conversione di tipo viene eseguita da nessuno degli operatori.

Ho confrontato la velocità di:

  • $a == $b vs $a === $b
  • dove $aed $berano numeri casuali [1, 100]
  • le due variabili sono state generate e confrontate un milione di volte
  • i test sono stati eseguiti 10 volte

E qui ci sono i risultati:

 $a == $b $a === $b
--------- ---------
 0.765770  0.762020
 0.753041  0.825965
 0.770631  0.783696
 0.787824  0.781129
 0.757506  0.796142
 0.773537  0.796734
 0.768171  0.767894
 0.747850  0.777244
 0.836462  0.826406
 0.759361  0.773971
--------- ---------
 0.772015  0.789120

Puoi vedere che la velocità è quasi identica.


13
mi chiedo cosa succede se fai qualche miliardo di iterazioni su una macchina che non sta facendo nient'altro e genera semplicemente la media. sembra che ci sia abbastanza rumore qui. ;)
Gung Foo,

4
Sono giunto alla stessa conclusione: nessuna differenza potrebbe essere messaggiata se si sa che gli operandi appartengono allo stesso tipo. Altri scenari non hanno senso. Quasi tutte le altre risposte sono sbagliate.
Paul Spiegel,

1
Credo che questa avrebbe dovuto essere la risposta selezionata. Non si limita a razionalizzare con assunzioni, le assunzioni sono state più o meno testate empiricamente.
Pedro Amaral Couto,

@PedroAmaralCouto Non credo, dato che 10 non è uno studio empirico. Il motivo principale per cui non vi è alcuna differenza è che il compilatore PHP probabilmente ottimizzerà il codice. Uno dovrebbe usare === a meno che non sia necessaria la conversione del tipo, aiuterà a ridurre l'errore semantico (anche se è una volta nella tua intera vita). Aiuta anche la persona successiva a leggere il codice quali regole vengono applicate. Scrivi una volta, viene letto alcune centinaia di volte, se può aiutare a chiarire il dubbio di una persona, è già riuscito. Inoltre nessun test di memoria se Empirical, poiché clone allo stesso tipo. Ci sono più risorse che solo tempo.
Marco,

@Marco, quando dico "studio empirico", intendo che si basa sull'esperienza, ad esempio: eseguire il codice invece di fare un argomento usando solo la ragione (o cosa hai in mente), senza un esperimento per sostenerlo. I valori di Salman A suggeriscono che === è ugualmente a volte un po 'più veloce e talvolta un po' più lento. Ciò significa che "Perché è === più veloce di == in PHP?" pone la domanda: "Come fai a sapere === è più veloce di =="? L'ottimizzazione del compilatore è una spiegazione, non ciò che è più veloce o più lento e non ho detto cosa dovrebbe essere usato.
Pedro Amaral Couto,

7

Non so davvero se è significativamente più veloce, ma === nella maggior parte delle lingue è un confronto diretto dei tipi, mentre == proverà a fare coercizione dei tipi se necessario / possibile per ottenere una corrispondenza.


9
Javascript ha l'operatore ===.
Frank Shearar,

Sono sicuro che puoi fare === in lisp e schema comuni.
Pupeno

Javascript - non in 3 definizioni di lingue che ho controllato;) E Lisp e Scheme sono molte cose, ma quasi comuni;)
TomTom

1
ruby ha ===. È passato troppo tempo per ricordare se fa la stessa cosa.
KitsuneYMG

1
Inoltre , ivedocs.adobe.com /flash/ 9.0 /ActionScriptLangRefV3/… per ActionScript. Fondamentalmente, google "rigorosa uguaglianza".
Chris

4

Il == incorre in un overhead maggiore di conversione del tipo prima del confronto. === controlla prima il tipo, quindi procede senza eseguire alcuna conversione di tipo.



3

In conclusione === è più veloce perché non converte il tipo di dati per vedere se due variabili hanno lo stesso valore, ma quando devi vedere se due variabili hanno lo stesso valore utilizzerai == se non raccogli quale tipo sono variabili o === se è importante anche il tipo di variabili.


0

Più veloce non dovrebbe essere misurato solo in tempi di esecuzione diretta (i test di prestazione diretti sono quasi trascurabili in questo caso). Detto questo, avrei bisogno di vedere un test che coinvolge iterazione, o ricorsione, per vedere davvero se c'è una differenza significativa, cumulativa (se usata in un contesto realistico). Anche i tempi di test e debug che risparmierai nel trattare i casi limite dovrebbero essere significativi per te


0

In php (codice c) il valore è una "classe" come:

class value
{
    $int_;
    $float_;
    $string_;
    $array_;
    $object_;
}

Quando stai confrontando $a == $bed $aè di inttipo, ci sarà qualcosa di simile:

if ($a->int_ == $b->int_ || $a->int_ == (int) $b->float_ || $a->int_ == (int) $b->string_ || ...)

ma string '1'non verrà trasmesso in codice ASCII 49, lo sarà 1.

Quando stai confrontando $a === $bed $aè di inttipo, ci sarà qualcosa di simile:

if ($a->int_ == $b->int_)

-4

Se i risultati del test sono corretti, deve trattarsi di un problema del compilatore,

Il processore farà tutto ciò che gli viene detto di fare su un ciclo di clock

Se ha meno da fare, sarà più veloce da fare

aggiunta:

Ah bene in realtà se il compilatore ha già creato un sacco di codice macchina da elaborare, quindi se ha già aggiunto miliardi di cose per far fronte a quale tipo di dati deve essere confrontato, la rimozione di un IF "minore" non cambierà molto la velocità affatto.

Se qualcuno continua a leggere questo, allora sono interessante per ulteriori discussioni.

Phil


Hai solo "una" istruzione IF nella tua base di codice? È strano perché in ogni base di codice su cui ho lavorato, abbiamo migliaia di istruzioni IF o comparative chiamate ovunque.
Lev
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.