Heim  >  Artikel  >  Backend-Entwicklung  >  Wie viel Leistungsverbesserung hat PHP 8 erreicht?

Wie viel Leistungsverbesserung hat PHP 8 erreicht?

Guanhui
Guanhuinach vorne
2020-06-05 09:29:077451Durchsuche

Wie viel Leistungsverbesserung hat PHP 8 erreicht?

Ende dieses Jahres wird PHP8 veröffentlicht. Obwohl diese Hauptversion über viele neue Funktionen wie Union-Typen, statische Rückgaben und Annotationsattribute usw. verfügt, ist die am meisten erwartete Verbesserung der JIT-Compiler.

Weitere Funktionen von PHP8 finden Sie unter PHP 8 ist da! Das PHP-Team hat die erste Beta-Version Alpha1 veröffentlicht

Theoretisch kann die Art und Weise, wie JIT die PHP-Skriptkompilierung handhabt, die Geschwindigkeit von Anwendungen erhöhen. Aber schauen wir mal, ob dieser Ansatz unseren Erwartungen gerecht wird.

Bitte beachten Sie, dass das in diesem Artikel verwendete PHP-8 nicht die endgültige Version ist.

Zuerst schreiben wir einen Code, der ausgeführt werden soll. Ich habe mich für die Blasensortierung entschieden, weil es der schlechteste Sortieralgorithmus ist und ich diesen Sortieralgorithmus nur für diese Art von Tests verwenden kann.

<?php
function bubble_sort($array){
  $start = microtime(true);
    do
    {
        $sw = false;
        for($i = 0, $size = count($array) - 1; $i < $size; $i++)
        {
            if( $array[$i] > $array[$i + 1] )
            {
                list( $array[$i + 1], $array[$i] ) =
                        array($array[$i], $array[$i + 1]);
                $sw = true;
            }
        }
    }
    while($sw);
$end = microtime(true);
return $end - $start;
}
$array = array(1000, -202, 3, 0, 2, 77, 5, -1, 4, 34, -203, 1, 0.5 , -3, 0.88,
 4000, 444, 0.99, -44, 4, 454443, -44444, 23, -201,
 5000, 444, 0.99, -44, 4, 4553, -4, 253, -201,
 6000, 444, 0.99, -44, 4, 443, -4, 2.3, -2.01,
 39000, 444, 0.99, -44, 4, 53, -4, 23, -201,
 309900, 444, 0.99, 23, 123, 453, -4, 23, -201,
 309900, 444, 0.99, -4.14, 4, 453, -4, 23, -201,
 309900, 444, 0.99, -4.44, 4, 453, -4, 23, -201,
 30500, 1144, 0.99, -4.4, 4, 453, -4, 23, -201,
 -3000, -444, 0.99, -44, 4, 453, -4, 23, -1,
 3000, 424, 0.19, -44, 4, 453, -4, 23, -21,
 300, 454, 0.99222, -44, 4, 453, -4, 23, -20.1,
 301110, 4442, 0.991, -44, 4, 453, -4, 2.443, -201,
 3033300, 33444, 0.49, -44, 4, 453, -4, 2.4443, -201,
 4000, 444, 0.99, -44, 4, 454443, -44444, 23, -201,
 5000, 444, 0.99, -44, 4, 4553, -4, 253, -201,
 6000, 444, 0.99, -44, 4, 443, -4, 2.3, -2.01,
 39000, 444, 0.99, -44, 4, 53, -4, 23, -201,
 309900, 444, 0.99, 23, 123, 453, -4, 23, -201,
 309900, 444, 0.99, -4.14, 4, 453, -4, 23, -201,
 309900, 444, 0.99, -4.44, 4, 453, -4, 23, -201,
 30500, 1144, 0.99, -4.4, 4, 453, -4, 23, -201,
 -3000, -444, 0.99, -44, 4, 453, -4, 23, -1,
 3000, 424, 0.19, -44, 4, 453, -4, 23, -21,
 300, 454, 0.99222, -44, 4, 453, -4, 23, -20.1,
 301110, 4442, 0.991, -44, 4, 453, -4, 2.443, -201,
 3033300, 33444, 0.49, -44, 4, 453, -4, 2.4443, -201,
 4000, 444, 0.99, -44, 4, 454443, -44444, 23, -201,
 5000, 444, 0.99, -44, 4, 4553, -4, 253, -201,
 6000, 444, 0.99, -44, 4, 443, -4, 2.3, -2.01,
 39000, 444, 0.99, -44, 4, 53, -4, 23, -201,
 309900, 444, 0.99, 23, 123, 453, -4, 23, -201,
 309900, 444, 0.99, -4.14, 4, 453, -4, 23, -201,
 309900, 444, 0.99, -4.44, 4, 453, -4, 23, -201,
 30500, 1144, 0.99, -4.4, 4, 453, -4, 23, -201,
 -3000, -444, 0.99, -44, 4, 453, -4, 23, -1,
 3000, 424, 0.19, -44, 4, 453, -4, 23, -21,
 300, 454, 0.99222, -44, 4, 453, -4, 23, -20.1,
 301110, 4442, 0.991, -44, 4, 453, -4, 2.443, -201,
 3033300, 33444, 0.49, -44, 4, 453, -4, 2.4443, -201,
 4000, 444, 0.99, -44, 4, 454443, -44444, 23, -201,
 5000, 444, 0.99, -44, 4, 4553, -4, 253, -201,
 6000, 444, 0.99, -44, 4, 443, -4, 2.3, -2.01,
 39000, 444, 0.99, -44, 4, 53, -4, 23, -201,
 309900, 444, 0.99, 23, 123, 453, -4, 23, -201,
 309900, 444, 0.99, -4.14, 4, 453, -4, 23, -201,
 309900, 444, 0.99, -4.44, 4, 453, -4, 23, -201,
 30500, 1144, 0.99, -4.4, 4, 453, -4, 23, -201,
 -3000, -444, 0.99, -44, 4, 453, -4, 23, -1,
 3000, 424, 0.19, -44, 4, 453, -4, 23, -21,
 300, 454, 0.99222, -44, 4, 453, -4, 23, -20.1,
 301110, 4442, 0.991, -44, 4, 453, -4, 2.443, -201,
 3033300, 33444, 0.49, -44, 4, 453, -4, 2.4443, -201,
 4000, 444, 0.99, -44, 4, 454443, -44444, 23, -201,
 5000, 444, 0.99, -44, 4, 4553, -4, 253, -201,
 6000, 444, 0.99, -44, 4, 443, -4, 2.3, -2.01,
 39000, 444, 0.99, -44, 4, 53, -4, 23, -201,
 309900, 444, 0.99, 23, 123, 453, -4, 23, -201,
 309900, 444, 0.99, -4.14, 4, 453, -4, 23, -201,
 309900, 444, 0.99, -4.44, 4, 453, -4, 23, -201,
 30500, 1144, 0.99, -4.4, 4, 453, -4, 23, -201,
 -3000, -444, 0.99, -44, 4, 453, -4, 23, -1,
 3000, 424, 0.19, -44, 4, 453, -4, 23, -21,
 300, 454, 0.99222, -44, 4, 453, -4, 23, -20.1,
 301110, 4442, 0.991, -44, 4, 453, -4, 2.443, -201,
 3033300, 33444, 0.49, -44, 4, 453, -4, 2.4443, -201,
 4000, 444, 0.99, -44, 4, 454443, -44444, 23, -201,
 5000, 444, 0.99, -44, 4, 4553, -4, 253, -201,
 6000, 444, 0.99, -44, 4, 443, -4, 2.3, -2.01,
 39000, 444, 0.99, -44, 4, 53, -4, 23, -201,
 309900, 444, 0.99, 23, 123, 453, -4, 23, -201,
 309900, 444, 0.99, -4.14, 4, 453, -4, 23, -201,
 309900, 444, 0.99, -4.44, 4, 453, -4, 23, -201,
 30500, 1144, 0.99, -4.4, 4, 453, -4, 23, -201,
 -3000, -444, 0.99, -44, 4, 453, -4, 23, -1,
 3000, 424, 0.19, -44, 4, 453, -4, 23, -21,
 300, 454, 0.99222, -44, 4, 453, -4, 23, -20.1,
 301110, 4442, 0.991, -44, 4, 453, -4, 2.443, -201,
 3033300, 33444, 0.49, -44, 4, 453, -4, 2.4443, -201,
 4000, 444, 0.99, -44, 4, 454443, -44444, 23, -201,
 5000, 444, 0.99, -44, 4, 4553, -4, 253, -201,
 6000, 444, 0.99, -44, 4, 443, -4, 2.3, -2.01,
 39000, 444, 0.99, -44, 4, 53, -4, 23, -201,
 309900, 444, 0.99, 23, 123, 453, -4, 23, -201,
 309900, 444, 0.99, -4.14, 4, 453, -4, 23, -201,
 309900, 444, 0.99, -4.44, 4, 453, -4, 23, -201,
 30500, 1144, 0.99, -4.4, 4, 453, -4, 23, -201,
 -3000, -444, 0.99, -44, 4, 453, -4, 23, -1,
 3000, 424, 0.19, -44, 4, 453, -4, 23, -21,
 300, 454, 0.99222, -44, 4, 453, -4, 23, -20.1,
 301110, 4442, 0.991, -44, 4, 453, -4, 2.443, -201,
 3033300, 33444, 0.49, -44, 4, 453, -4, 2.4443, -201,
 4000, 444, 0.99, -44, 4, 454443, -44444, 23, -201,
 5000, 444, 0.99, -44, 4, 4553, -4, 253, -201,
 6000, 444, 0.99, -44, 4, 443, -4, 2.3, -2.01,
 39000, 444, 0.99, -44, 4, 53, -4, 23, -201,
 309900, 444, 0.99, 23, 123, 453, -4, 23, -201,
 309900, 444, 0.99, -4.14, 4, 453, -4, 23, -201,
 309900, 444, 0.99, -4.44, 4, 453, -4, 23, -201,
 30500, 1144, 0.99, -4.4, 4, 453, -4, 23, -201,
 -3000, -444, 0.99, -44, 4, 453, -4, 23, -1,
 3000, 424, 0.19, -44, 4, 453, -4, 23, -21,
 300, 454, 0.99222, -44, 4, 453, -4, 23, -20.1,
 301110, 4442, 0.991, -44, 4, 453, -4, 2.443, -201,
 3033300, 33444, 0.49, -44, 4, 453, -4, 2.4443, -201,
 4000, 444, 0.99, -44, 4, 454443, -44444, 23, -201,
 5000, 444, 0.99, -44, 4, 4553, -4, 253, -201,
 6000, 444, 0.99, -44, 4, 443, -4, 2.3, -2.01,
 39000, 444, 0.99, -44, 4, 53, -4, 23, -201,
 309900, 444, 0.99, 23, 123, 453, -4, 23, -201,
 309900, 444, 0.99, -4.14, 4, 453, -4, 23, -201,
 309900, 444, 0.99, -4.44, 4, 453, -4, 23, -201,
 30500, 1144, 0.99, -4.4, 4, 453, -4, 23, -201,
 -3000, -444, 0.99, -44, 4, 453, -4, 23, -1,
 3000, 424, 0.19, -44, 4, 453, -4, 23, -21,
 300, 454, 0.99222, -44, 4, 453, -4, 23, -20.1,
 301110, 4442, 0.991, -44, 4, 453, -4, 2.443, -201,
 3033300, 33444, 0.49, -44, 4, 453, -4, 2.4443, -201,
 4000, 444, 0.99, -44, 4, 454443, -44444, 23, -201,
 5000, 444, 0.99, -44, 4, 4553, -4, 253, -201,
 6000, 444, 0.99, -44, 4, 443, -4, 2.3, -2.01,
 39000, 444, 0.99, -44, 4, 53, -4, 23, -201,
 309900, 444, 0.99, 23, 123, 453, -4, 23, -201,
 309900, 444, 0.99, -4.14, 4, 453, -4, 23, -201,
 309900, 444, 0.99, -4.44, 4, 453, -4, 23, -201,
 30500, 1144, 0.99, -4.4, 4, 453, -4, 23, -201,
 -3000, -444, 0.99, -44, 4, 453, -4, 23, -1,
 3000, 424, 0.19, -44, 4, 453, -4, 23, -21,
 300, 454, 0.99222, -44, 4, 453, -4, 23, -20.1,
 301110, 4442, 0.991, -44, 4, 453, -4, 2.443, -201,
 3033300, 33444, 0.49, -44, 4, 453, -4, 2.4443, -201,
 4000, 444, 0.99, -44, 4, 454443, -44444, 23, -201,
 5000, 444, 0.99, -44, 4, 4553, -4, 253, -201,
 6000, 444, 0.99, -44, 4, 443, -4, 2.3, -2.01,
 39000, 444, 0.99, -44, 4, 53, -4, 23, -201,
 309900, 444, 0.99, 23, 123, 453, -4, 23, -201,
 309900, 444, 0.99, -4.14, 4, 453, -4, 23, -201,
 309900, 444, 0.99, -4.44, 4, 453, -4, 23, -201,
 30500, 1144, 0.99, -4.4, 4, 453, -4, 23, -201,
 -3000, -444, 0.99, -44, 4, 453, -4, 23, -1,
 3000, 424, 0.19, -44, 4, 453, -4, 23, -21,
 300, 454, 0.99222, -44, 4, 453, -4, 23, -20.1,
 301110, 4442, 0.991, -44, 4, 453, -4, 2.443, -201,
 3033300, 33444, 0.49, -44, 4, 453, -4, 2.4443, -201,
 4000, 444, 0.99, -44, 4, 454443, -44444, 23, -201,
 5000, 444, 0.99, -44, 4, 4553, -4, 253, -201,
 6000, 444, 0.99, -44, 4, 443, -4, 2.3, -2.01,
 39000, 444, 0.99, -44, 4, 53, -4, 23, -201,
 309900, 444, 0.99, 23, 123, 453, -4, 23, -201,
 309900, 444, 0.99, -4.14, 4, 453, -4, 23, -201,
 309900, 444, 0.99, -4.44, 4, 453, -4, 23, -201,
 30500, 1144, 0.99, -4.4, 4, 453, -4, 23, -201,
 -3000, -444, 0.99, -44, 4, 453, -4, 23, -1,
 3000, 424, 0.19, -44, 4, 453, -4, 23, -21,
 300, 454, 0.99222, -44, 4, 453, -4, 23, -20.1,
 301110, 4442, 0.991, -44, 4, 453, -4, 2.443, -201,
 3033300, 33444, 0.49, -44, 4, 453, -4, 2.4443, -2010000
);
echo "\n";
echo bubble_sort($array);
echo "\n";
?>

Ich weiß, dass dieses Skript nicht sehr gut geschrieben ist, insbesondere das fiese Array in der Mitte. Ich weiß, dass ich ein zufälliges Array generieren kann. Ich weiß auch, dass ich dieses Array aus einer Datei lesen kann. Ich möchte jedoch nur einen sehr langsamen Bubbling-Algorithmus, der keine Berücksichtigung anderer Faktoren erfordert. Ich möchte in diesem Benchmark kein zusätzliches Rauschen haben.

Zuerst haben wir das Skript in der aktuellen Version von PHP 7.4 ausgeführt:

docker container run --rm -v $(pwd):/script/ php:7.4 php /script/bubble.php

Wenn wir es 100 Mal ausgeführt haben, haben wir eine durchschnittliche Zeit von 0,10253500938416 Sekunden erhalten – nicht schlecht.

Jetzt, da wir PHP-8 verwenden, aktivieren Sie das JIT noch nicht.

docker container run --rm -v $(pwd):/script/ martinpham/php8:fpm-extra-alpine php /script/bubble.php

Die durchschnittliche Zeit für den gleichen Lauf 100 Mal beträgt 0,098223924636841 Sekunden. Ehrlich gesagt ist diese Verbesserung nicht sehr offensichtlich.

Als nächstes testen wir den lang erwarteten JIT:

docker container run --rm -v $(pwd):/script/ keinos/php8-jit php /script/bubble.php

Die durchschnittliche Laufzeit beträgt 0,053637981414795 Sekunden! JIT ist in der Tat eine Überraschung! Für jemanden wie mich, dem die Ausführungszeit sehr am Herzen liegt, ist das ein Segen. Wenn man sich die Zahlen allein ansieht, spürt man zwar nicht viel (nur eine Verbesserung von 0,04458594322 Sekunden), aber wenn man sie in einen Prozentsatz umrechnet, sieht man den Vorteil besser: 45,39 %.

Ich wollte aus mehreren Blickwinkeln vergleichen, also habe ich die PHP-5.3-Version von 2009 verwendet, um diesen Code auszuführen.

Docker Container Run --rm -v $(pwd):/script/ php:5.3 php /script/bubble.php

Es dauerte durchschnittlich 0,64574003219604 Sekunden. Das sind 0,5921020508 voller als PHP-8 mit aktiviertem JIT (ein Rückgang um -1.103,88)! Oh mein Gott, wie sind wir 2009 hierher gekommen?

Hinweis:

Das von mir gewählte Skript hat nur einen reinen Bubbling-Algorithmus. Natürlich können Sie auch andere Codes ausprobieren, beispielsweise das Problem des Handlungsreisenden oder einen Binärbaum. Die Ergebnisse sollten ähnlich sein.

Wie ich im Artikel erwähnt habe, ist die Version von PHP-8, die dieser Benchmark ausgeführt hat, nicht endgültig, daher ist es möglich, dass die endgültige Version weitere Verbesserungen hinzufügt.

Ich habe in den Testergebnissen viele Dezimalstellen beibehalten. Obwohl es sehr ausführlich aussieht, wollte ich einfach so genau wie möglich sein.

Beim Benchmarking verwende ich die Docker-Images von Keinos und Martinpham. Tatsächlich gibt es viele andere Tools. Sie können das auswählen, das Ihnen gefällt, und es ausprobieren.

Der Laptop, auf dem ich die Tests durchgeführt habe, war: Linux Manjaro, 3 GHz Intel Core i5, 32 GB RAM. In anderen Konfigurationen können die genauen Zahlen variieren, aber ich glaube, dass die Verbesserungen ähnlich sein werden.

Eine ausführliche Einführung in den JIT-Compiler finden Sie in diesem Artikel Neue Funktionen von PHP8 – Detaillierte grafische Erläuterung von JIT

Das obige ist der detaillierte Inhalt vonWie viel Leistungsverbesserung hat PHP 8 erreicht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:zhihu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen