variable estática para la optimización
-
20-09-2019 - |
Pregunta
Me pregunto si puedo usar una variable estática para la optimización:
public function Bar() {
static $i = moderatelyExpensiveFunctionCall();
if ($i) {
return something();
} else {
return somethingElse();
}
}
Yo sé que una vez que se ha inicializado $i
, no va a ser cambiado por por esa línea de código en llamadas sucesivas a Bar()
. I asumen , esto significa que moderatelyExpensiveFunctionCall()
no será evaluado cada vez que llamo, pero me gustaría saber con certeza.
Una vez PHP ve una variable estática que se ha inicializado, lo hace saltar sobre esa línea de código? En otras palabras, ¿es esto va a optimizar mi tiempo de ejecución si hago un montón de llamadas a Bar()
, o estoy perdiendo el tiempo?
Solución
Me resulta más fácil hacer algo así como el código de abajo. De esta forma el almacenamiento en caché de llevarlo a cabo, en lugar de por la ejecución de la función.
function moderatelyExpensiveFunctionCall()
{
static $output = NULL;
if( is_null( $output ) ) {
//set $output
}
return $output;
}
Otros consejos
static $i = blah()
no se compilará, porque PHP no permite expresiones y llamadas a funciones en inicializadores estáticos. Es necesario algo así como
function foo() {
static $cache = null;
if(is_null($cache)) $cache = expensive_func();
do something with $cache
}
Esto debería funcionar en su caso (bastante simple):
function your_function() {
static $output;
if (!isset($output)) {
$output = 'A very expensive operation';
}
return $output;
}
En cuanto a un mecanismo de caché global, se puede utilizar un método similar al éste .
A continuación se enfoque bastante más corto:
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;
}
¿Qué hay de:
if (!isset($i))
{
static $i = moderatelyExpensiveFunctionCall();
}