単純な階乗関数を使用してこのテストを実行しました ( 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 遅い