create_function
の代わりにコールバックのクロージャを使用することを決定しました。そのため、PHP> 5.3はほとんどの場合、デバッグ性が向上していることを前提としています。 )私の状況でcreate_function
のオンザフライコンパイルのオーバーヘッドはおそらく、余分な比較やそのような関数内で作られなければならないものを相殺するだろうということです。PHPのクロージャまたはcreate_function
私のアプリケーションの場合はこれでも問題はないかもしれませんが、さらにテストする必要がありますが、私はcreate_function
メソッドが2倍以上速いというこの(非常に)簡単なテストの出力に興味がありました。 4つの条件文(およびコンカチ)のみを削除できる場合はクロージャを使用します。明らかに、私のテストケースでは余分な処理は行われていません。スピードの大部分が失われたり失われたりしますが、余分な処理はほとんどありませんが、コールバックが十分に呼び出されたとき、私はcreate_function
を使う方が良いかもしれないと考え始めました。
create_function
とeval
の明白な類似性はありますが、私は慎重です。
したがって、主な質問は、create_function
で作成された匿名関数とクロージャの関数との違いは何ですか?
eval
の機能が無効になっている場合、create_function
も機能しますか?そして、私は最近、create_function
関数が内部関数として宣言されていてもグローバル(またはクラス)名前空間を汚染すると最近読んだと確信していますが、クロージャはそうではありません。私は今これについての言及を見つけることができませんが、それらの言明のどちらかまたは両方が真ですか?
これは私が走った少しテストです:
<?php
function foo($a=true, $b=true, $c=true, $d=true)
{
$inner1 = create_function(
'',
'$r = \''.($a ? 'a' : '').
($b ? 'b' : '').
($c ? 'c' : '').
($d ? 'd' : '').'\';
return $r;'
);
$inner2 = function() use ($a, $b, $c, $d)
{
$r = '';
if($a) { $r .= 'a'; }
if($b) { $r .= 'b'; }
if($c) { $r .= 'c'; }
if($d) { $r .= 'd'; };
return $r;
};
$time = microtime(true);
for ($x=0; $x<99999; ++$x)
{
$i1out = $inner1();
}
echo '1:'.(microtime(true)-$time).'<br>';
$time = microtime(true);
for ($x=0; $x<99999; ++$x)
{
$i2out = $inner2();
}
echo '2:'.(microtime(true)-$time).'<br>';
echo var_dump($i1out===$i2out).'<br>';
}
foo();
名前空間 'create_function'でテストするのはかなり簡単です。..関数を作成します。:) –
私もクロージャーに行きます。スピードに関しては、実際のケースのシナリオでテストする必要があるかもしれません。なぜ私はそれがずっと遅くなければならないのか分かりませんが、私は「ヒット」をとるでしょう。また、APCはこのケースで違いを生みますか?オペコードにクロージャがキャッシュされていますか?それはまた違いを生むかもしれない。 – Arend
分割してください。この質問はすでに...長いです。 – phihag