最適化のための静的変数
-
20-09-2019 - |
質問
最適化に静的変数を使用できるかどうか疑問に思っています。
public function Bar() {
static $i = moderatelyExpensiveFunctionCall();
if ($i) {
return something();
} else {
return somethingElse();
}
}
一度は知っています $i
が初期化されている場合、連続した呼び出しのコード行によって変更されることはありません。 Bar()
. 。私 仮定する この意味は moderatelyExpensiveFunctionCall()
電話するたびに評価されるわけではありませんが、確実に知りたいのです。
PHP は初期化された静的変数を見つけると、そのコード行をスキップしますか?言い換えれば、多くの呼び出しを行った場合、実行時間は最適化されますか? Bar()
, 、それとも時間を無駄にしているのでしょうか?
解決
私はそれが簡単に以下のコードのような何かを見つけます。そのように、キャッシュではなく、関数の実装あたりのグローバルに行われます。
function moderatelyExpensiveFunctionCall()
{
static $output = NULL;
if( is_null( $output ) ) {
//set $output
}
return $output;
}
他のヒント
PHPは、静的初期化子内の式や関数呼び出しを許可していないため、
static $i = blah()
は、コンパイルされません。あなたは、
function foo() {
static $cache = null;
if(is_null($cache)) $cache = expensive_func();
do something with $cache
}
これはあなたの(非常に単純な)ケースではうまくいくはずです:
function your_function() {
static $output;
if (!isset($output)) {
$output = 'A very expensive operation';
}
return $output;
}
グローバル キャッシュ メカニズムに関しては、次のような方法を使用できます。 これです.
ここではかなり短いアプローチがあります:
function stuff()
{
static $smthg = []; // or null, or false, or something else
if ($smthg) {
return $smthg;
}
// filling $smthg goes here
// with a lot of
// code strings
return $smthg;
}
いかがます:
if (!isset($i))
{
static $i = moderatelyExpensiveFunctionCall();
}
所属していません StackOverflow