HHVM 没有按预期编译 JWT 库

HHVM not compiling JWT library as expected

当我运行这样编码时

$before = microtime(true);

$amount = 90000000;
$sum = 0;

for ($i = 0; $i < $amount; $i++) {
    $sum += $i;
}
echo $sum;

$after = microtime(true);
echo '<br>'.($after-$before);

它 运行 比我将整个东西包装在一个函数中要慢得多,因为 HHVM 不会在全局范围内为循环编译。

echo "loop in function <br /><br />";
function run_loop ($amount, $sum) {
    for ($i = 0; $i < $amount; $i++) {
        $sum += $i;
    }
    return $sum;
}
echo run_loop($amount, $sum);

最后一个 运行s 比第一个快 10 倍,即使第一个仍然 运行s 比股票 PHP 5.6 快 运行s。

但是当我尝试使用来自 firebase 的 JWT 库做这样的事情时

https://github.com/firebase/php-jwt

然后像这样测试

require_once("JWT.php");

$before = microtime(true);

$amount = 100000;

for ($i = 0; $i < $amount; $i++) {
    $jwt = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ';
    $decoded = JWT::decode($jwt, 'secret', array('HS256'));
}
echo $decoded->name;

然后这个 运行s 就像我将它包装在一个函数中一样

echo "loop in function <br /><br />";
function run_loop ($amount) {
    $jwt = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ';
    for ($i = 0; $i < $amount; $i++) {
        $decoded = JWT::decode($jwt, 'secret', array('HS256'));
    }
    return $decoded->sub;
}
echo run_loop($amount);

这让我相信 HHVM 不会编译 JWT 库,因为它们 运行 一样快,即使它是全局范围内的 for 循环或包装在函数中。所以我的问题是。如何检查 JWT 库中的 HHVM 不支持哪些函数或方法?有没有办法让我找到 HHVM 支持的所有功能?你认为是因为 JWT 库吗?

HHVM 无法很好地优化顶层(即函数外部)的代码 运行。

在第一个示例中,大部分工作发生在函数之外——"work" 是 $sum += $i。将它移动到一个函数中,你的第二个例子,允许 HHVM 很好地优化它,因为它真的很微不足道。 (虽然这不是一个好的基准,因为它太不现实了!)

在您的第三个和第四个示例中,您显示的代码中几乎没有进行任何工作。我怀疑 JWT::decode 负责大部分正在完成的工作——并且它已经在一个函数中。将调用它的代码移出顶层虽然是个好主意,但并没有像以前那样有帮助,因为它所做的相关工作较少。繁重的工作已经发生在函数中,即 JWT::decode.

至于如何让HHVM更好地优化JWT::decode,这是一个很复杂的问题。如果您有兴趣,您可以自己从源代码构建 HHVM,使用不同的分析工具(例如 Linux perf 命令)来查看 HHVM 将时间花在哪里,并对其进行优化。