我使用简单的阶乘函数执行了此测试(借用http://avelino.xxx/2014/03/golang-c-and-python-the-benchmark-time中的逻辑)
常规PHP代码
function fact($n){
if($n===0)return 1;
return $n*fact($n-1);
}
function calc(){
$t = 0;
for($i=0; $i<100000; $i++){
for($j=0; $j<8; $j++){
$t += fact($j);
}
}
return $t;
}
$result = calc();
echo $result."\n";
Run Code Online (Sandbox Code Playgroud)
PHP使用Zephir
$fact = new Utils\Fact();
$result = $fact->calc();
echo $result."\n";
Run Code Online (Sandbox Code Playgroud)
Zephir代码
namespace Utils;
class Fact{
public function fact(int n) -> int{
if(n==0){
return 1;
}
return n*this->fact(n - 1);
}
public function calc() -> int{
int i,j,total;
let total = 0;
for i in range(0,99999){
for j in range (0,7){
let total = total + this->fact(j);
}
}
return total;
}
}
Run Code Online (Sandbox Code Playgroud)
我使用time命令以下列方式执行这些片段:
常规PHP
time php -c /etc/php5/apache2/php.ini regular.php
Run Code Online (Sandbox Code Playgroud)
结果
591400000
real 0m0.788s
user 0m0.736s
sys 0m0.026s
Run Code Online (Sandbox Code Playgroud)
PHP使用Zephir类
time php -c /etc/php5/apache2/php.ini zephyr.php
Run Code Online (Sandbox Code Playgroud)
结果
591400000
real 0m1.529s
user 0m1.494s
sys 0m0.024s
Run Code Online (Sandbox Code Playgroud)
HHVM
time hhvm regular.php
Run Code Online (Sandbox Code Playgroud)
结果
591400000
real 0m0.883s
user 0m0.814s
sys 0m0.045s
Run Code Online (Sandbox Code Playgroud)
从上面的结果可以看出,常规PHP代码似乎比使用已编译的Zephyr类作为PHP扩展的代码表现更好.这让我感到困惑.
脚本代码如何最终比编译代码更快,特别是当两者都采用相同的逻辑时?我想我在这里遗漏了一些东西,如果有人能帮助我理解这一点,我将不胜感激.
编辑:看起来其他人正面临与Zephir类似的问题:Zephir 2x慢
我不知道西风,但HHVM是一个JIT,所以你要支付额外的启动成本,以便将来运行更快.尝试增加您的基准测试,如果您想真正看到HHVM执行,则需要1分钟或10分钟.
此外,在某些情况下,我们决定不在命令行模式下打开JIT,因此强制它使用-vEval.Jit = true