Heim > Backend-Entwicklung > PHP-Tutorial > Ternärer PHP-Operator: schnell oder nicht?

Ternärer PHP-Operator: schnell oder nicht?

藏色散人
Freigeben: 2023-04-04 21:36:01
Original
4828 Leute haben es durchsucht

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.

Ternärer PHP-Operator: schnell oder nicht?

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 = '';
}
Nach dem Login kopieren

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[&#39;test&#39;][$i] = $i;
}
// you can also just create a big string
// $context = str_repeat(&#39; &#39;, 1000000);

// benchmark
$time = microtime(true);
for ($i = 0; $i < 100; $i++) {
    // the snippet of code to benchmark
    $tmp = isset($context[&#39;test&#39;]) ? $context[&#39;test&#39;] : &#39;&#39;;
}
printf("TIME: %0.2d\n", (microtime(true) - $time) * 1000);
Nach dem Login kopieren

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[&#39;test&#39;];

// the copy happens now
$tmp[] = true;

// copy also happens if the original variable changes
// $context[&#39;test&#39;][] = true;
Nach dem Login kopieren

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[&#39;test&#39;] ?: &#39;&#39;;
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage