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 将时间花在哪里,并对其进行优化。
当我运行这样编码时
$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 将时间花在哪里,并对其进行优化。