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 に答える