PHP5からPHP7になって速度向上したけど、どうやって?という質問に答える

どうも、PHPerしんのすけでございやす

先日、とある社長と呑んでおりましたら、PHPの話題に。
「PHP7は高速化されたんですよー」と私が言うと、このように質問されました。

え?JITが導入されたの?

えっと...どうだったっけ?
きちんとお答えできないということは、私が知ってるようでいて、何も知らないということ。
改めて調べ直しました。

PHPの高速化事情を整理

JITの解説

PHPはインタプリタ型のプログラミング言語です。

アクセスが来たら、ソースコードを読み込んで、opcodeへ変換し、順番に逐次実行されます。実行終了したらコードは破棄されます。

opcodeというのは中間コードの一種で、CPUやOSなどの実行環境に依存せず同一コードが生成されます。
このopcodeを機械語に一行一行翻訳しながら実行を進めるというのが現在のPHPの実行方法でして、一般的にこういったインタプリタの処理速度は遅いです。

そこでJITの登場です。JITとは、Just-In-Timeコンパイラのことで、最初のソースコードの読み込み時に、opcodeへ変換して、さらに機械語(ネイティブコード)まで一気に変換を済ませてしまう処理方法となります。もちろんかなり高速化されますが、技術的に難しく大変な改修となります。

JITの導入はPHP8から

PHP5からPHP7となって、速度面が向上したのですが、PHP8になると上記のJITが導入されます。
それにより更に大幅な速度面の向上が期待されます。

このへんをごっちゃにしていたので、呑みの席でハッキリと答えられなかったのでした。

ちなみにですが、FacebookはもともとPHPで書かれており、PHPが遅いためFacebook社が独自開発したHHVM(HipHop Virtual Machine)というJIT導入されたPHP高速実行環境も存在します。PHP7以降は高速に動くようになったため、HHVMを利用するメリットはなくなり非推奨となっております。

速度比較

上記記事によると、PHP5.6とPHP7.0のスコア差で、2.4倍速くなってます。

このPHP7にJITが導入されるとさらに数十倍の速度向上が見込まれると言われていますが、ほんの一例として以下のようなベンチマーク検証があります。(2015年の投稿ですので、あくまで参考程度に。)

PHP7 0.281秒 → PHP7+JIT 0.011秒 実に、25倍速くなっています!

PHPの今後の活躍

現在のPHPは、データ分析や機械学習、3DCG映像レンダリングの分野においてpythonに引けをとってますが、JITが導入されてからはPHPもこういった分野にもどんどん進出していくことが期待できます。

ちなみに、リレーショナルDBとつないでゴニョゴニョする限りは、ディスク読み書き速度がボトルネックになるので現状のPHPでも全然問題ないです。上に挙げたようなCPUをフル回転させる系の仕事で、その本領発揮となります。

PHP7が高速になった理由

やっと本題なのですが、JITをまだ入れていないとしたら「じゃあPHP7はなんで速くなったの?」という質問に答えていきたいと思います。

...と思いましたがコチラに詳しく解説が載っていました。詳細はコチラご参照くださいw

すごく簡素にまとめると、こんなところです。

変数の管理方法を変更。メモリアクセス効率化。

例えば、内部で文字列参照は実体までポインタ3回たどってたけど、ポインタ2回で済むようにした。
このチューニングによってパフォーマンスが大幅改善した。

連想配列(ハッシュテーブル)も変更

これまでは、要素追加するたび、メモリ領域を動的確保してリストチェーンで繋いで、辿っていた。
PHP7からは実体データを連続して領域確保するように。走査性能が向上。

関数の引数の処理

これまで、関数がどういった引数を取るのかを理解するために、文字列解析を行っていてそれがまぁまぁの負荷となっていた。関数を呼ぶたびに、その引数仕様を解析するのでオーバーヘッドが発生する。
PHP7からは、この処理をC言語でおなじみの「マクロ関数」で代用できるようにした。

まとめ

  • PHP8からJIT搭載して爆速化
  • PHP7が高速化した理由は、全体的に機構を変えて無駄を排除する形に最適化したから

以上です。