Was ist mit PHP der schnellste Weg, einen String wie diesen "123"
in eine Ganzzahl umzuwandeln ?
Warum ist diese Methode die schnellste? Was passiert, wenn unerwartete Eingaben wie z. B. "hello"
ein Array eingehen?
php
optimization
casting
nickf
quelle
quelle
(int)
undintval()
kann über 400% betragen!Antworten:
Ich habe gerade eine schnelle Benchmarking-Übung eingerichtet:
Im Durchschnitt ist der Aufruf von intval () zweieinhalb Mal langsamer, und der Unterschied ist am größten, wenn Ihre Eingabe bereits eine Ganzzahl ist.
Es würde mich interessieren, warum .
Update: Ich habe die Tests erneut durchgeführt, diesmal mit Zwang
(0 + $var)
Nachtrag: Ich bin gerade auf ein etwas unerwartetes Verhalten gestoßen, das Sie bei der Auswahl einer dieser Methoden beachten sollten:
Getestet mit PHP 5.3.1
quelle
+"15" == 15
(int)
undintval
, und in jedem Paar, gibt einen% aufintval
, muss der Basisfall sein(int)
. Aber Sie haben einen guten Punkt, dass es klarer gewesen wäre, wenn er dies ausdrücklich gesagt hätte, zumal er später einen dritten Fall hinzugefügt hat!Ich persönlich finde Casting am schönsten.
Sollte eine Zeichenfolge wie 'Hallo' gesendet werden, wird sie in eine Ganzzahl 0 umgewandelt. Bei einer Zeichenfolge wie '22 Jahre alt 'wird sie in eine Ganzzahl 22 umgewandelt. Alles, was nicht auf eine Zahl analysiert werden kann, wird zu 0.
Wenn Sie wirklich die Geschwindigkeit brauchen, sind die anderen Vorschläge hier richtig, wenn Sie davon ausgehen, dass Zwang am schnellsten ist.
quelle
Führen Sie einen Test durch.
Dies war ein Test, bei dem jedes Szenario 10.000.000 Mal ausgeführt wurde. :-)
Co-ercion ist
0 + "123"
Casting ist
(integer)"123"
Ich denke, Co-ercion ist ein kleines bisschen schneller. Oh, und es
0 + array('123')
ist ein schwerwiegender Fehler in PHP. Möglicherweise möchten Sie, dass Ihr Code den Typ des angegebenen Werts überprüft.Mein Testcode ist unten.
quelle
settype
habe diesen Test hinzugefügt und ihn mit PHP 7 ausgeführt. Die Besetzung hat sich vorne leicht herausgestellt und insgesamt eine große Leistungsverbesserung erzielt: String-Koerce: 1.9255340099335 String-Cast: 1.5142338275909 String-Settype: 4.149735212326 String-Fail-Coerce: 1.2346560955048 String-Fail-Cast: 1.3967711925507 String Fail Cast Settype: 4.149735212326Mit FLOAT können Sie lange Zeichenfolgen einfach in Ganzzahlen konvertieren
$float = (float)$num;
Oder wenn Sie möchten, dass eine Ganzzahl nicht schwebend ist, gehen Sie mit
$float = (int)$num;
Zum Beispiel.
quelle
(int)
? Es mag sein, dass, wenn die Zeichenfolge eine Ganzzahl enthält,(float)
ein Wert zurückgegeben wird, der sich stark wie eine Ganzzahl verhält (obwohl der interne Typ wahrscheinlich istfloat
), aber warum sollten Sie dies tun, wenn die Spezifikation einen Ganzzahlwert zurückgeben soll ? Angenommen, die eingehende Zeichenfolge ist "1.3"? Sie erhalten keine Ganzzahl. Damit in Zukunft jeder den Code lesen kann, sollten Sie auch sagen, was Sie meinen. Wenn Sie "es sollte eine ganze Zahl sein" meinen(int)
, dann sagen Sie nicht(float)
.quelle
Ganzzahlauszug aus einer beliebigen Zeichenfolge
$ in = 'tel.123-12-33';
// $ out = '1231233';
quelle
Weitere Ad-hoc-Benchmark-Ergebnisse:
quelle
{ $i = +"-11"; $i = +"-11"; $i= +"-11"; $i= +"-11"; ... }
. Es ist auch riskant, den wörtlichen Wert"-11"
direkt zu verwenden, es sei denn, Sie sind sicher, dass die Sprache beim Kompilieren einen Teil der Arbeit nicht erledigt. Wahrscheinlich in Ordnung für eine dynamische Sprache wie PHP, aber ich erwähne sie zum späteren Nachschlagen, wenn ich Formeln in anderen Sprachen teste. Es ist sicherer, eine Variable$x = "-11"
vor der Testschleife festzulegen und sie dann zu verwenden. Damit ist der innere Code$i =+$x
.Es wurde ein Benchmark erstellt, und es stellt sich heraus, dass der schnellste Weg, eine echte Ganzzahl zu erhalten (unter Verwendung aller verfügbaren Methoden), ist
Nur mit
gibt einen float zurück.
quelle
(int)"12.345"
? Um wie viel Prozent schneller?