y_uti のブログ

統計、機械学習、自然言語処理などに興味を持つエンジニアの技術ブログです

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 に対応していないためです。

f:id:y_uti:20140418232353p:plain

一部のプログラムでは、処理が関数化されていないために、そのまま 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 による実行の方が大きな時間がかかってしまっています。