43

我正在评估 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 秒以上。我错过了什么?

4

3 回答 3

101

HHVM 工程师在这里。

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

优化构建中的默认值为 N=11,因此如果您要运行请求 12 次,第 12 次会快得多。

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

这样做有几个原因。

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

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

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

例如,如果我们观察到某个值在 99% 的情况下是整数,我们可以编译针对整数情况优化的代码。我们目前没有在启用分析的情况下对代码进行 JIT 编译的工具(困难的部分是一旦我们完成它就安全地丢弃它),所以我们在仅解释器模式下进行数据收集。

于 2013-07-28T21:55:15.830 回答
2

我有同样的性能问题,只有在 /etc/hhvm/php.ini 中注释了这些行之后,我才能得到令人印象深刻的结果

;hhvm.log.level = Warning
;hhvm.log.always_log_unhandled_exceptions = true
;hhvm.log.runtime_error_reporting_level = 8191
于 2015-03-19T12:32:28.343 回答
2

如果 HHVM > v3.4 将 Eval.JitWarmupRequests=0 更改为 Eval.JitProfileInterpRequests=0

`#!/usr/bin/hhvm -v Eval.Jit=1 -v Eval.JitProfileInterpRequests=0 ./do.php`
于 2015-04-26T02:47:19.443 回答