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?

¿Fue útil?

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();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top