Warum ist === schneller als == in PHP?

168

Warum ist ===schneller als ==in PHP?

Coderex
quelle
40
Es ist schneller, aber deutlich schneller?
Piskvor verließ das Gebäude am
19
Bitte lesen Sie nicht, was in PHP schneller ist. Lesen Sie, wie Sie interessante Daten in einer einzelnen SQL-Abfrage erhalten, ohne JOINs zu missbrauchen.
Kamil Szot
15
Für wen es sich für das gleiche Thema interessieren könnte === vs ==, aber für JAVASCRIPT, kann hier gelesen werden: stackoverflow.com/questions/359494/…
Marco Demaio
5
@Piskvor, das ist nicht die Frage
Pacerier
6
@ Pacerier: Fairer Punkt - deshalb habe ich dies nur kommentiert. Es beantwortet die Frage nicht, bietet aber eine Perspektive darauf.
Piskvor verließ das Gebäude

Antworten:

200

Da der Gleichheitsoperator ==den Datentyp vorübergehend erzwingt oder konvertiert, um festzustellen, ob er dem anderen Operanden entspricht, während ===(der Identitätsoperator) keinerlei Konvertierung durchführen muss und somit weniger Arbeit erledigt wird, was ihn schneller macht.

meder omuraliev
quelle
Ich denke, Ihre Meinung widerspricht dem, was das PHP-Handbuch sagt. Sie sagen, $ a == $ b ist WAHR, wenn $ a gleich $ b ist, wobei $ a === $ b WAHR ist, wenn $ a gleich $ b ist, und sie sind vom gleichen Typ.
Bakhtiyor
92
Wie ist es dann entgegengesetzt?
Meder Omuraliev
2
Ich glaube, es ist tatsächlich so, dass die beiden Operanden für komplexe Typen auf denselben Speicherbereich verweisen, aber die Antwort von Meder umfasst dies
Basic
1
Es macht Sinn (wie in JS), aber es wäre schön, wenn jemand auch einen Verweis auf einige wirklich einfache Leistungstests hinzufügt.
Marco Demaio
4
phpbench.com zeigt im Abschnitt "Kontrollstrukturen" einen Leistungsunterschied zwischen == und === an.
Ekillaby
54

===führt keine Typumwandlung durch, 0 == '0'wertet also aus true, aber 0 === '0'- bis false.

Raveren
quelle
25

Zuerst prüft ===, ob die beiden Argumente vom gleichen Typ sind. Daher schlagen die Nummer 1 und die Zeichenfolge '1' bei der Typprüfung fehl, bevor tatsächlich Vergleiche durchgeführt werden. Auf der anderen Seite überprüft == nicht zuerst den Typ und konvertiert beide Argumente in denselben Typ und führt dann den Vergleich durch.

Daher kann === einen Fehlerzustand schneller überprüfen

iblamefish
quelle
8
Ich würde vermuten, dass dies ==auch zuerst den Typ überprüft, um festzustellen, ob eine Typkonvertierung durchgeführt werden muss. Die Tatsache, dass ===im folgenden Schritt keine Konvertierung durchgeführt wird, macht sie schneller.
Täuschung
25

Es gibt zwei Dinge zu beachten:

  1. Wenn Operandentypen unterscheiden sich dann ==und ===erzeugen unterschiedliche Ergebnisse . In diesem Fall spielt die Geschwindigkeit der Bediener keine Rolle. Was zählt, ist, welches das gewünschte Ergebnis liefert.

  2. Wenn Operandentypen gleich sind, können Sie einen ==oder ===beide verwenden, um dieselben Ergebnisse zu erzielen . In diesem Fall ist die Geschwindigkeit beider Bediener nahezu identisch. Dies liegt daran, dass keiner der Operatoren eine Typkonvertierung durchführt.

Ich verglich die Geschwindigkeit von:

  • $a == $b vs. $a === $b
  • wo $aund $bwaren zufällige ganze Zahlen [1, 100]
  • Die beiden Variablen wurden millionenfach generiert und verglichen
  • Die Tests wurden 10 Mal durchgeführt

Und hier sind die Ergebnisse:

 $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

Sie können sehen, dass die Geschwindigkeit fast identisch ist.

Salman A.
quelle
13
Ich frage mich, was passiert, wenn Sie einige Milliarden Iterationen auf einer Maschine ausführen, die nichts anderes tut und nur den Durchschnitt ausgeben. Es sieht so aus, als ob hier ziemlich viel Lärm ist. ;)
Gung Foo
4
Ich kam zu dem gleichen Schluss: Kein Unterschied könnte durcheinander gebracht werden, wenn bekannt ist, dass die Operanden vom gleichen Typ sind. Andere Szenarien machen keinen Sinn. Fast alle anderen Antworten sind einfach falsch.
Paul Spiegel
1
Ich glaube, das hätte die ausgewählte Antwort sein sollen. Es rationalisiert nicht nur mit Annahmen, die Annahmen wurden mehr oder weniger empirisch getestet.
Pedro Amaral Couto
@PedroAmaralCouto Ich glaube nicht, da 10 keine empirische Studie ist. Der Hauptgrund, warum es so gut wie keinen Unterschied gibt, ist, dass der PHP-Compiler den Code wahrscheinlich optimieren wird. Man sollte === verwenden, es sei denn, eine Typkonvertierung ist erforderlich, um semantische Fehler zu reduzieren (selbst wenn sie einmal in Ihrem ganzen Leben auftreten). Es hilft auch der nächsten Person, die den Code liest, welche Regeln durchgesetzt werden. Sie schreiben einmal, es wird einige hundert Mal gelesen. Wenn es helfen kann, den Zweifel einer Person auszuräumen, ist es bereits erfolgreich. Auch kein Speichertest wenn empirisch, da auf den gleichen Typ klonen. Es gibt mehr Ressourcen als nur Zeit.
Marco
@Marco, wenn ich "empirische Studie" sage, meine ich, dass sie auf Erfahrung basiert, z. B.: Code ausführen, anstatt ein Argument nur aus Gründen (oder was Sie denken) zu führen, ohne ein Experiment, um es zu sichern. Salman A-Werte deuten darauf hin, dass === manchmal etwas schneller und manchmal etwas langsamer ist. Dies bedeutet "Warum ist === schneller als == in PHP?" wirft die Frage auf: "Woher weißt du, dass === schneller ist als =="? Compiler-Optimierungen sind eine Erklärung, nicht was schneller oder langsamer ist und ich habe nicht gesagt, was verwendet werden soll.
Pedro Amaral Couto
7

Ich weiß nicht wirklich, ob es wesentlich schneller ist, aber === ist in den meisten Sprachen ein direkter Typvergleich, während == versucht, bei Bedarf / möglich Typenzwang zu üben, um eine Übereinstimmung zu erzielen.

Chris
quelle
9
Javascript hat den Operator ===.
Frank Shearar
Ich bin sicher, Sie können === in gemeinsamen Lisp und Schema tun.
Pupeno
Javascript - nicht in 3 Sprachdefinitionen, die ich überprüft habe;) Und Lisp und Scheme sind viele Dinge, aber kaum üblich;)
TomTom
1
Rubin hat ===. Es war zu lange für mich, mich daran zu erinnern, ob es dasselbe tut.
KitsuneYMG
1
Auch Livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/… für Actionscript. Grundsätzlich Google "strikte Gleichheit".
Chris
4

Das == verursacht vor dem Vergleich einen größeren Aufwand für die Typkonvertierung. === überprüft zuerst den Typ und fährt dann fort, ohne dass eine Typkonvertierung durchgeführt werden muss.

Martin
quelle
3

Zusammenfassend lässt sich sagen, dass === schneller ist, da der Datentyp nicht konvertiert wird, um festzustellen, ob zwei Variablen denselben Wert haben. Wenn Sie jedoch feststellen müssen, ob zwei Variablen denselben Wert haben, verwenden Sie ==, wenn nicht festgelegt ist, welcher Typ Variablen sind , oder === wenn wichtig ist auch die Art der Variablen.

D. Martin
quelle
0

Schneller sollte nicht nur in der direkten Ausführungszeit gemessen werden (direkte Leistungstests sind in diesem Fall nahezu vernachlässigbar). Das heißt, ich müsste einen Test mit Iteration oder Rekursion sehen, um wirklich zu sehen, ob es einen signifikanten kumulativen Unterschied gibt (wenn er in einem realistischen Kontext verwendet wird). Die Test- und Debugging-Zeit, die Sie beim Umgang mit Edge-Fällen sparen, sollte auch für Sie von Bedeutung sein

Anthony Rutledge
quelle
0

In PHP (C-Code) ist der Wert eine "Klasse" wie:

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

Wenn Ihr vergleichen $a == $bund $aist intArt, wird es wie etwas sein:

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

wird aber string '1'nicht in ASCII-Code umgewandelt 49, sondern 1.

Wenn Sie vergleichen $a === $bund $aist intArt, wird es wie some sein:

if ($a->int_ == $b->int_)
d0niek
quelle
-4

Wenn die Testergebnisse korrekt sind, muss es sich um ein Compilerproblem handeln.

Der Prozessor wird in einem Taktzyklus alles tun, was ihm gesagt wird

Wenn es weniger zu tun hat, ist es schneller zu tun

Zusatz:

Na ja, wenn der Compiler bereits eine Menge zu verarbeitenden Maschinencodes erstellt hat und dann bereits zig Millionen Dinge hinzugefügt hat, um zu bewältigen, welche Art von Daten verglichen werden müssen, ändert das Entfernen einer "kleinen" IF die Geschwindigkeit nicht wesentlich überhaupt.

Wenn jemand dies noch liest, bin ich an weiteren Diskussionen interessiert.

Phil

Phil Allen
quelle
Haben Sie nur "eine" IF-Anweisung in Ihrer Codebasis? Das ist seltsam, weil wir in jeder Codebasis, an der ich gearbeitet habe, Tausende von IF- oder Vergleichsanweisungen haben, die überall aufgerufen werden.
Lev