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


168

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


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.


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.


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


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.


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.


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.



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.


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


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_)

-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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.