Menschen lieben Optimierung. Sie sind leicht zu verstehen und leicht anzuwenden…. Doch als ich mir vor einiger Zeit die Pull-Requests von Twig ansah, las ich eine interessante Diskussion über die Leistung des ternären Operators in PHP.
Wissen Sie, welcher der folgenden Clips der schnellste ist (sie machen natürlich genau das Gleiche)?
// snippet 1 $tmp = isset($context['test']) ? $context['test'] : ''; // snippet 2 if (isset($context['test'])) { $tmp = $context['test']; } else { $tmp = ''; }
Die richtige Antwort lautet:
Je nach Verfügbarkeit. Meistens sind ihre Geschwindigkeiten gleich und Sie müssen sich nicht darum kümmern. Wenn $context['test'] jedoch viele Daten enthält, ist Snippet 2 viel schneller als Snippet 1.
Hier ist der Code, den ich zum Testen verschiedener Szenarien verwendet habe:
$context = array('test' => true); // optionally fill-in the test value with lots of data for ($i = 0; $i < 100000; $i++) { $context['test'][$i] = $i; } // you can also just create a big string // $context = str_repeat(' ', 1000000); // benchmark $time = microtime(true); for ($i = 0; $i < 100; $i++) { // the snippet of code to benchmark $tmp = isset($context['test']) ? $context['test'] : ''; } printf("TIME: %0.2d\n", (microtime(true) - $time) * 1000);
Beachten Sie , dass die absoluten Leistungszahlen hier bedeutungslos sind. Wir wollen lediglich die Geschwindigkeit zwischen verschiedenen Clips vergleichen.
Auf meinem Laptop dauert die Ausführung von Snippet 1 über 2 Sekunden, während Snippet 2 etwa 0,05 ms benötigt. Das ist ein großer Unterschied! Wenn die zu testende Variable jedoch nicht viele Daten enthält, ist die Geschwindigkeit nahezu gleich.
Warum ist der ternäre Operator in manchen Fällen langsam? kopiert immer den Wert, während die if-Anweisung dies nicht tut. Warum? Da PHP eine Technik namens Copy-on-Write verwendet: Wenn Sie einer Variablen einen Wert zuweisen, erstellt PHP erst dann eine Kopie des Inhalts der Variablen, wenn diese geändert wird.
Wenn Sie eine Anweisung wie $tmp = $context['test'] schreiben, passiert fast nichts: Die Variable $tmp wird einfach zu einer Referenz auf die Variable $context['test'], deshalb ist es sehr schnell. Aber sobald Sie die Variable ändern möchten, muss PHP das Original kopieren:
$tmp = $context['test']; // the copy happens now $tmp[] = true; // copy also happens if the original variable changes // $context['test'][] = true;
Zusammenfassend lässt sich sagen, dass die Geschwindigkeit des ternären Operators direkt mit der Zeit zusammenhängt, die zum Kopieren des Ergebnisses benötigt wird Erklärung, auch wenn dies nicht unbedingt erforderlich ist. Das Kopieren eines Arrays mit 100.000 Elementen nimmt Zeit in Anspruch.
Wenn Sie PHP 5.3 verwenden, gibt es eine einfachere Möglichkeit, unsere Aussage mit dem neuen ?:construct:: auszudrücken.
$tmp = $context['test'] ?: '';
In Bezug auf die Leistung haben diese neuen Konstrukte jedoch die gleichen Nachteile wie Standardkonstrukte, auch wenn PHP möglicherweise in der Lage ist, den Fall zu optimieren, in dem Variablen vorhanden sind.
Das obige ist der detaillierte Inhalt vonTernärer PHP-Operator: schnell oder nicht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!