今年末には、PHP8 がリリースされます。このメジャー バージョンには、共用体型、静的戻り値、アノテーション属性 などの多くの新機能がありますが、最も期待されている改善点は JIT コンパイラ です。
PHP8 のその他の機能については、PHP 8 はこちらを参照してください。 PHP チームは、最初のベータ版 Alpha1
をリリースしました。理論的には、JIT が PHP スクリプトのコンパイルを処理する方法により、アプリケーションの速度が向上します。しかし、このアプローチが期待に応えられるかどうかを見てみましょう。
この記事で使用されている PHP-8 は最終バージョンではないことに注意してください。
まず、実行するコードを書きましょう。バブル ソートを選択したのは、これが最悪のソート アルゴリズムであり、この種のテストにのみこのソート アルゴリズムを使用できるためです。
<?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"; ?>
このスクリプト、特に真ん中の厄介な配列があまりよく書かれていないことはわかっています。ランダムな配列を生成できることはわかっています。この配列をファイルから読み取ることができることもわかっています。ただし、他の要素を考慮する必要がない、非常に遅いバブリング アルゴリズムが必要です。このベンチマークにはこれ以上のノイズは望ましくありません。
まず、現在のバージョンの PHP 7.4 でスクリプトを実行しました。
docker container run --rm -v $(pwd):/script/ php:7.4 php /script/bubble.php
100 回実行した結果、平均時間は 0.10253500938416 秒でした。これは悪くありません。
PHP-8 で実行しているので、まだ JIT をアクティブ化しないでください。
docker container run --rm -v $(pwd):/script/ martinpham/php8:fpm-extra-alpine php /script/bubble.php
100 回の実行の平均時間は 0.098223924636841 秒です。正直に言うと、この改善はあまり明らかではありません。
次に、待望の JIT をテストしてみましょう:
docker container run --rm -v $(pwd):/script/ keinos/php8-jit php /script/bubble.php
平均実行時間は 0.053637981414795 秒です。 JIT は本当に驚きです。実行時間を非常に気にしている私のような人にとって、これは恩恵です。数字だけ見るとあまり実感がありませんが (わずか 0.04458594322 秒の改善)、パーセンテージに換算すると 45.39% という利点がよくわかります。
もっと多くの角度から比較したかったので、2009 PHP-5.3 バージョンを使用してこのコードを実行しました。
docker container run --rm -v $(pwd):/script/ php:5.3 php /script/bubble.php
平均 0.64574003219604 秒かかりました。 JIT を有効にした場合の PHP-8 よりも 0.5921020508 大きい (-1,103.88 の低下)。なんと、2009 年にどうやってここにたどり着いたのでしょうか?
注:
私が選択したスクリプトには、純粋なバブリング アルゴリズムのみが含まれています。もちろん、巡回セールスマン問題や二分木などの他のコードを試すこともできます。結果は同様になるはずです。
記事で述べたように、このベンチマークで実行された PHP-8 のバージョンは最終バージョンではないため、最終リリースでは他の改善が追加される可能性があります。
テスト結果には小数点以下の桁を多く入れておきました。非常に冗長に見えますが、できる限り正確にしたかっただけです。
ベンチマーク テストでは、keinos と martinpham の docker イメージを使用しました。実際には他にもたくさんのツールがあるので、好きなものを選んで試してみてください。
私がテストを実行したラップトップは、Linux Manjaro、3 GHz Intel Core i5、32 GB RAM でした。他の構成では、正確な数値は異なる場合がありますが、改善は同様になると思います。
JIT コンパイラの詳細については、この記事を参照してください。PHP8 の新機能 JIT のグラフィックとテキストの説明
以上がPHP 8 ではどの程度パフォーマンスが向上しましたか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。