HHVM性能不佳
我正在评估HipHop-PHP在代码库上的兼容性和性能,但是在启用内置web服务器的情况下运行它时,性能会变差。
我有下面的示例testing程序,计算一个斐波那契数列。
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将运行在解释器模式下看到的前N个请求(即closuresJIT)。
优化版本中的缺省值是N = 11,所以如果你要运行这个请求12次,那么第12次就会快得多。
你可以用一个configuration选项来调整它,就像这样: -v Eval.JitWarmupRequests=3
。 如果将其设置为0,则会立即看到加速。
有几个理由要做到这一点。
首先,它防止瞬间热身效应影响JIT编译的代码。
例如,前几个请求可能需要在APC中填充值,这将导致应用程序代码沿着来自稳态path的不同path。 这样,我们不会浪费JIT编译的空间,只会使用几次。
其次,它允许HHVM收集分析信息以改进未来的编译。
例如,如果我们观察到某个值是整数的99%,那么我们可以编译针对整数情况优化的代码。 我们目前还没有能够在启用configuration文件的情况下对代码进行JIT编译的function(当我们完成这个工作时,硬件部分会安全地丢弃它),所以我们在只有解释器的模式下进行数据收集。
我有同样的性能问题,只有在/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`