hnwの日記

PHP7はなぜ速いのか(zval編)

この記事はPHP Advent Calendar 2014の7日目です。


僕は先日のPHPカンファレンス2014でPHP7に関するLTをしました(参照:「PHPNGの動向」)。ただ、時間が限られていたこともあり、あまり踏み込んだ内容には触れませんでした。


本稿ではLTの内容から深掘りし、zvalという内部的な構造体がどう変わるのか、性能面のメリットにフォーカスして解説してみます。

PHPをとりまく状況

まず最近のPHPの話題をおさらいしておきましょう。


これまでPHPには実用レベルの別実装が存在しない状態が続いていましたが、HHVMの登場で状況が変わってきました。HHVMはFacebookが開発しているPHP実行環境で、PHPより高速で互換性も高いのが特徴です。Facebookで実際に利用されているだけでなく、他の企業でも商用サービスで利用する事例が増えてきています。


そんな中、2014年のはじめ頃にPHPの性能改善プロジェクトPHPNGがスタートしました。これはPHPコミッターでありZend Technologies社員でもあるDmitry Stogovによるもので、PHP内部のデータ構造の変更をすることでPHPの言語仕様を変えずに性能改善を行うものです。このプロジェクトは極めて順調に進み、2014年8月にはPHP7のベースプロジェクトとして採用されました。


説明が前後してしまいますが、PHPのバージョニングについても最近動きがありました。現時点でのPHPの最新版は5.6.3ですが、次のメジャーバージョンアップで7.0になることが決まっています(参照:「PHP RFC: Name of Next Release of PHP」)。PHP7は2015年11月のリリースを目指しており、2015年6月にはコードフリーズしてRC1が出る予定です(参照:「PHP RFC: PHP 7.0 timeline」)。


ちなみに、PHP7での性能改善はかなり進んでいます。下記グラフはZendCon 2014での発表からの引用ですが、WordPressベンチマークテストしたときにPHP5.6の約1.7倍、HHVMに匹敵する性能となっています。


(「PHPNG a New Core for PHP7」より)

PHP7でzvalが変わった

ここから本題です。既に紹介しましたが、PHP7では内部的なデータ構造が変更されており、これが性能改善に貢献しています。


中でも、zval構造体の変更はかなり大胆な内容だと言えます。zvalは全てのPHP変数を管理するためのデータ構造であり、今回の変更はPHPソースコード全体に影響するような大変更になっています。ここに注目したこと、これをやりきったことはかなりのhackだと思います。


以下、このzval構造体の変更内容について図を交えて説明していきます。

続きを読む