我使用一个简单的阶乘函数(借用了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";使用Zephir的PHP
$fact = new Utils\Fact();
$result = $fact->calc();
echo $result."\n";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;
}
}我使用time命令以下列方式执行这些代码段:
正则PHP
time php -c /etc/php5/apache2/php.ini regular.php结果
591400000
real 0m0.788s
user 0m0.736s
sys 0m0.026s使用Zephir类
time php -c /etc/php5/apache2/php.ini zephyr.php结果
591400000
real 0m1.529s
user 0m1.494s
sys 0m0.024sHHVM
time hhvm regular.php结果
591400000
real 0m0.883s
user 0m0.814s
sys 0m0.045s问题:
从上面的结果可以看出,常规PHP代码似乎比使用已编译的Zephyr类作为PHP扩展的代码执行得更好。这就是我所困惑的。
如何使脚本代码比编译的代码更快,特别是当两者使用相同的逻辑时?我想我漏掉了一些东西,如果有人能帮我理解这件事,我会很感激的。
编辑:看起来其他人也面临着与Zephir:Zephir 2x慢速类似的问题
发布于 2014-03-07 23:08:29
我不知道zephyr,但是HHVM是一个JIT,所以您需要支付额外的启动成本,这样以后的运行就会更快。尝试增加您的基准,以便它需要1分钟或10分钟,如果您想要真正看到HHVM执行。
另外,在某些情况下,我们决定在命令行模式下不打开JIT,所以使用-vEval.Jit=true强制它继续。
https://stackoverflow.com/questions/22259688
复制相似问题