Hack と PHP の実行速度の比較 - その2
前回に引き続き、Hack と PHP の実行速度を比較してみます。今回は、Computer Language Benchmarks Game に掲載されているコードを借りて、PHP と HHVM のそれぞれで実行時間を計測しました。
Computer Language Benchmarks Game はプログラミング言語のベンチマークサイトで、さまざまなプログラミング言語で実装されたベンチマークプログラムと実行結果が掲載されています。すでに Hack でのベンチマーク結果も掲載されているのですが、PHP とは異なる実装での実行結果なので、仮想機械の違いによる差とはいえません。そこで、今回は、このサイトに掲載されている PHP のプログラムを PHP (の仮想機械) と HHVM でそれぞれ実行し、実行時間を計測してみます。
まず、以下のページから PHP のコードを取得します。11 種類のベンチマークプログラムのうち、fasta-redux を除いた 10 種類のプログラムを利用できます。
これを PHP と HHVM で実行した結果は、以下のようになりました。なお計算のサイズは、PHP での実行が 10 秒前後になるように適当に設定しています。実行時間は、それぞれの条件で 5 回ずつ実行した平均です。10 種類のプログラムのうち、pidigits.php は HHVM では実行できませんでした。これは、Hack は現時点では GMP に対応していないためです。
一部のプログラムでは、処理が関数化されていないために、そのまま HHVM で実行すると実行速度が低下してしまいます。これは、前回の記事で確認したとおりです。全体を単純に main 関数で包んであげることで、問題なく高速化できました。binary-trees を例にコードの差分を示します。他のプログラムでも同じような変更になります。
$ diff -bBwE binary-trees.php binary-trees.hh 1c1 < <?php --- > <?hh 29a30 > function main($argc, $argv) { 62a64,66 > } > > main($argc, $argv);
大半のベンチマークプログラムでは HHVM の方が高速に実行できていますが、regex-dna と reverse-complement の二つは、HHVM で実行しても高速化できませんでした。regex-dna は正規表現によるパターンマッチが処理の中心になっており、PHP でも HHVM でも大きな差は無さそうです。reverse-complement は文字列操作関数を用いた処理が中心で、これは HHVM による実行の方が大きな時間がかかってしまっています。