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.
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
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:
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.
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
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.
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.
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.
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
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.
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.
=== vs ==
, aber für JAVASCRIPT, kann hier gelesen werden: stackoverflow.com/questions/359494/…Antworten:
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.quelle
===
führt keine Typumwandlung durch,0 == '0'
wertet also austrue
, aber0 === '0'
- bisfalse
.quelle
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
quelle
==
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.Es gibt zwei Dinge zu beachten:
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.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
$a
und$b
waren zufällige ganze Zahlen [1, 100]Und hier sind die Ergebnisse:
Sie können sehen, dass die Geschwindigkeit fast identisch ist.
quelle
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.
quelle
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.
quelle
Weil
===
die Operanden nicht gezwungen werden müssen, vom gleichen Typ zu sein, bevor sie verglichen werden.Ich bezweifle jedoch, dass der Geschwindigkeitsunterschied sehr groß ist. Unter normalen Umständen sollten Sie den sinnvolleren Operator verwenden.
quelle
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.
quelle
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
quelle
In PHP (C-Code) ist der Wert eine "Klasse" wie:
Wenn Ihr vergleichen
$a == $b
und$a
istint
Art, wird es wie etwas sein:wird aber
string
'1'
nicht in ASCII-Code umgewandelt49
, sondern1
.Wenn Sie vergleichen
$a === $b
und$a
istint
Art, wird es wie some sein:quelle
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
quelle