検索
ニュース

「PHP 8」にJITを導入、パフォーマンスが大幅向上CPUに負荷がかかるワークロードに有用

開発中の「PHP 8」にJITコードを取り込む提案がPHPの開発者コミュニティーの投票で可決された。CPUに負荷のかかるワークロードで実行速度が劇的に高まるという。

Share
Tweet
LINE
Hatena

 オープンソースの汎用(はんよう)プログラミング言語「PHP」の最新版「PHP 8」へ「JIT(Just-In-Time)」コンパイラを導入することが決まった。

 JITコードの取り込みについては、RFC(Request for Comments)として提案されており、2019年3月21〜28日に開発者コミュニティーで投票が行われ、50対2で可決された。

 これを受け、PHP JITブランチのコードがPHPのマスターブランチにマージされた。発表時点ではPOSIXプラットフォームと、Windowsのx86/x64プラットフォームをサポートしている。

 RFCでは、PHP 8にJITを取り込む理由として以下の3つが挙げられていた。

  • 他の最適化手法ではこれ以上パフォーマンスを高めることができない段階に、PHPが達している JITを使用しない限り、PHPのパフォーマンスをこれ以上高めることができない
  • JITを使用することで、PHPがWeb以外のCPU集約型のシナリオで、より頻繁に使われる可能性が広がる こうしたシナリオでは、JITの使用によるパフォーマンスの向上メリットが非常に大きいと予想される。PHPは現状では、恐らくこうしたシナリオで利用が検討されることがほぼない
  • JITが使用可能になれば、パフォーマンスを大幅に犠牲にすることなく、C言語の代わりに(またはC言語に加えて)PHPで組み込み関数を開発することが可能になる こうなれば、イノベーションが加速することはもちろん、Cベースの開発に付き物のメモリ管理、オーバーフローなどの問題の影響を受けにくい、より安全な実装が可能になる

ベンチマークで4倍の性能向上を測定

 RFCでは、Mandelbrotベンチマークによる以下の関数について実行結果の公開データを参照し、JITによってパフォーマンスが4倍以上向上することを指摘している。

function iterate($x,$y)
{
    $cr = $y-0.5;
    $ci = $x;
    $zr = 0.0;
    $zi = 0.0;
    $i = 0;
    while (true) {
        $i++;
        $temp = $zr * $zi;
        $zr2 = $zr * $zr;
        $zi2 = $zi * $zi;
        $zr = $zr2 - $zi2 + $cr;
        $zi = $temp + $temp + $ci;
        if ($zi2 + $zr2 > BAILOUT)
            return $i;
        if ($i > MAX_ITERATIONS)
            return 0;
    }
}
速度の測定に用いられたコード

 JITの導入により、パフォーマンスを測定する「bench.php」の実行時間が、0.320秒から0.140秒へと半分以下に短縮されたことも、RFCでは紹介している。JITは、ほとんどのCPU集約型ワークロードの動作を大幅に高速化すると予想されている。

今後はWordPressでの高速化も狙う

 ただし、現時点では、「WordPress」のようなアプリケーションでは、JITによるパフォーマンス改善があまり期待できないという。このため、プロファイリングや投機的最適化により、こうしたアプリケーションでもJITの効果を高めることを計画している。

 RFCによれば、JITのモダンな実装である「PHP JIT」は、JavaScriptの「V8」やPHP互換のHHVM(HipHop Virtual Machine)、Pythonの「PyPy」などと比べて、極めてシンプルだという。その一方で、PHP JITは、PHPの全体的な複雑さを招き、新たなタイプのバグが発生するリスクや、開発および保守コストを増大させるといった課題があるという。

 PHP JITの実装は、コードをコンパイルし、共有メモリへ保持しておくOPcacheとはほぼ独立した形となった。PHP JITはコンパイル時と実行時に有効にしたり、無効にしたりできる。PHP JITを有効にすると、PHPファイルのネイティブコードはOPcacheの共有メモリに設けられた追加領域に格納される。JITコードのエントリポイントを指すポインタは「op_array」→「opcodes[].handler」に保持される。

 このため、PHP JITには下位互換性の問題はないものの、「xdebug」などのサードパーティーのデバッガや、「XHProf」「Blackfire」「Tideways」といったプロファイラに影響するという。

 なお、今回のJIT技術を、同じく開発中の「PHP 7.4」に実験機能として取り込むことが併せて提案されたものの、こちらは投票で否決された。

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る