我使用一个简单的阶乘函数执行了这个测试(借用了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";
PHP 使用 Zephir
$fact = new Utils\Fact();
$result = $fact->calc();
echo $result."\n";
西菲尔代码
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
PHP 使用 Zephir 类
time php -c /etc/php5/apache2/php.ini zephyr.php
结果
591400000
real 0m1.529s
user 0m1.494s
sys 0m0.024s
HHVM
time hhvm regular.php
结果
591400000
real 0m0.883s
user 0m0.814s
sys 0m0.045s
问题:
从上面的结果可以看出,常规的 PHP 代码似乎比使用编译的 Zephyr 类作为 PHP 扩展的代码执行得更好。这让我感到困惑。
脚本代码如何最终比编译代码更快,尤其是当两者都使用相同的逻辑时?我想我在这里遗漏了一些东西,如果有人能帮助我理解这一点,我将不胜感激。
编辑:看起来其他人也面临与 Zephir 类似的问题:Zephir 2x 慢