コードベースでの互換性とパフォーマンスについてHipHop-PHPを評価していますが、ビルトインWebサーバーを有効にして実行するとパフォーマンスが非常に低下します。
フィボナッチ数列を計算する次のサンプルテストプログラムがあります。
ex3.php:
function fib($n)
{
if ($n <= 2)
return 1;
else
return fib($n-1) + fib($n-2);
}
$n = 36;
printf("fib(%d) = %d\n", $n, fib($n, 2));
コマンドラインを使用してHHVMでこれを実行すると、印象的な結果が得られます。
time hhvm -v"Eval.Jit=true" -f ./ex3.php
fib(36) = 14930352
real 0m0.267s
user 0m0.248s
sys 0m0.020s
これを標準のPHPと比較してください:
root@hiphop:/www# time php -f ./ex3.php
fib(36) = 14930352
real 0m5.606s
user 0m5.600s
sys 0m0.000s
ただし、HHVMの組み込みWebサーバーを有効にすると、すべてのパフォーマンスの向上が失われます。
hhvm -v"Eval.Jit=true" -m server -p 8000 &
time wget -qSO - http://localhost:8000/ex3.php
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
X-Powered-By: HPHP
Date: Sat, 27 Jul 2013 14:16:09 GMT
Content-Length: 19
fib(36) = 14930352
real 0m5.279s
user 0m0.000s
sys 0m0.000s
ご覧のとおり、HHVMから応答が返されていますが、この要求を処理するのに5秒以上かかります。私は何が欠けていますか?
HHVMエンジニアはこちら。
サーバーモードでは、HHVMはインタープリターのみのモード(つまりJITがオフ)で最初に表示されるN個の要求を実行します。
最適化されたビルドのデフォルトはN = 11であるため、リクエストを12回実行すると、12番目のリクエストの方がはるかに高速になります。
次のように設定オプションでこれを調整できます:-v Eval.JitWarmupRequests=3
。 0に設定すると、すぐに速度が向上します。
これにはいくつかの理由があります。
まず、一時的なウォームアップ効果がJITでコンパイルされたコードに影響するのを防ぎます。
たとえば、最初のいくつかのリクエストでは、APCに値を入力する必要がある場合があります。これにより、アプリケーションコードが定常状態のパスとは異なるパスをたどります。このようにして、数回しか使用されないJITコンパイルのスペースを無駄にしません。
次に、HHVMがプロファイリング情報を収集して、将来のコンパイルを改善できるようにします。
たとえば、特定の値が99%の時間の整数であることがわかれば、整数の場合に最適化されたコードをコンパイルできます。現在、プロファイリングを有効にしてコードをJITコンパイルする機能はありません(処理が完了したらハード部分は安全に破棄されます)。したがって、インタープリターのみのモードでデータ収集を行います。
同じパフォーマンスの問題があり、/ etc/hhvm/php.iniでこれらの行をコメントした後にのみ印象的な結果が得られます。
;hhvm.log.level = Warning
;hhvm.log.always_log_unhandled_exceptions = true
;hhvm.log.runtime_error_reporting_level = 8191
hHVM> v3.4の場合、Eval.JitWarmupRequests = 0をEval.JitProfileInterpRequests = 0に変更
`#!/ usr/bin/hhvm -v Eval.Jit = 1 -v Eval.JitProfileInterpRequests = 0 ./do.php`