HHVM性能不佳

Ste*_*man 43 performance hhvm

我正在评估HipHop-PHP在我们的代码库上的兼容性和性能,但是在启用内置Web服务器的情况下运行时,我的性能非常差.

我有以下样本测试程序来计算Fibonacci序列.

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));
Run Code Online (Sandbox Code Playgroud)

当我使用命令行通过HHVM运行时,我得到了令人印象深刻的结果:

time hhvm -v"Eval.Jit=true" -f ./ex3.php
fib(36) = 14930352

real    0m0.267s
user    0m0.248s
sys     0m0.020s
Run Code Online (Sandbox Code Playgroud)

将其与标准PHP进行比较:

root@hiphop:/www# time php -f ./ex3.php
fib(36) = 14930352

real    0m5.606s
user    0m5.600s
sys     0m0.000s    
Run Code Online (Sandbox Code Playgroud)

但是,当我想在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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我从HHVM获得了响应,但它处理此请求的时间超过5秒.我错过了什么?

Owe*_*chi 101

HHVM工程师在这里.

在服务器模式下,HHVM将运行它在仅解释器模式下看到的前N个请求(即关闭JIT).

优化版本中的默认值为N = 11,因此如果您要运行12次请求,则第12次会更快.

您可以使用配置选项对此进行调整,如下所示:-v Eval.JitWarmupRequests=3.如果将其设置为0,您将立即看到加速.

有几个原因可以做到这一点.

首先,它可以防止瞬态预热影响影响JIT编译的代码.

例如,前几个请求可能需要在APC中填充值,这将导致应用程序代码从稳态路径向下走不同的路径.这样,我们不会浪费JIT编译空间,只会使用几次.

其次,它允许HHVM收集分析信息以改进将来的编译.

例如,如果我们观察到特定值是99%的整数,我们就可以编译针对整数情况优化的代码.我们目前没有JIT编译代码的功能,启用了分析功能(一旦我们完成它,硬件就会安全地抛弃它),所以我们在仅解释器模式下进行数据收集.