Variable statique pour l'optimisation
-
20-09-2019 - |
Question
Je me demande si je peux utiliser une variable statique pour l'optimisation:
public function Bar() {
static $i = moderatelyExpensiveFunctionCall();
if ($i) {
return something();
} else {
return somethingElse();
}
}
Je sais qu'une fois $i
est initialisé, il ne sera pas modifié par par cette ligne de code sur les appels successifs à Bar()
. I Supposons , cela signifie que moderatelyExpensiveFunctionCall()
ne sera pas évalué chaque fois que je l'appelle, mais j'aimerais savoir pour certains.
Une fois que PHP voit une variable statique qui a été initialisé, est-il sauter sur cette ligne de code? En d'autres termes, cela va optimiser mon temps d'exécution si je fais beaucoup d'appels à Bar()
, ou suis-je perdre mon temps?
La solution
Je trouve plus facile de faire quelque chose comme le code ci-dessous. De cette façon, la mise en cache se fait à l'échelle mondiale plutôt que par la mise en œuvre de la fonction.
function moderatelyExpensiveFunctionCall()
{
static $output = NULL;
if( is_null( $output ) ) {
//set $output
}
return $output;
}
Autres conseils
static $i = blah()
ne compile pas, parce que php ne permet pas les expressions et les appels de fonctions dans initialiseurs statiques. Vous avez besoin de quelque chose comme
function foo() {
static $cache = null;
if(is_null($cache)) $cache = expensive_func();
do something with $cache
}
Cela devrait fonctionner dans votre (très simple) cas:
function your_function() {
static $output;
if (!isset($output)) {
$output = 'A very expensive operation';
}
return $output;
}
En ce qui concerne un mécanisme de mise en cache globale, vous pouvez utiliser une méthode similaire à celui-ci .
Voici approche assez courte:
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;
}
Que diriez-vous:
if (!isset($i))
{
static $i = moderatelyExpensiveFunctionCall();
}