3

我使用一个简单的阶乘函数执行了这个测试(借用了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 慢

4

1 回答 1

5

我不了解 zephyr,但 HHVM 是 JIT,因此您需要支付额外的启动成本,以便将来运行更快。如果您想真正看到 HHVM 的性能,请尝试增加您的基准测试,这样需要 1 分钟或 10 分钟。

此外,在某些情况下,我们决定不在命令行模式下打开 JIT,因此使用 -vEval.Jit=true 强制打开

于 2014-03-07T23:08:29.240 回答