Existem métodos que calculam uma informação de acordo com parâmetros informados (ou não) e retornam um resultado. Para alguns destes métodos, pode ser útil utilizar um cache de resultados para otimizar chamadas sucessivas ao método com parâmetros idênticos.
Para prover a otimização destes métodos, é utilizada uma variável estática que guarda os resultados já calculados.
Assim, antes de calcular um resultado, é verificado se ele já foi calculado. Veja um exemplo:
/**
* Funcao sem otimizacao
*/
function fazer_conta($x, $y) {
return ($x + $y) * ($x - y) / 2;
}
/**
* Funcao com otimizacao
*/
function fazer_conta($x, $y) {
static $resultados = array();
// Se ainda nao calculou o resultado para os parametros informados
if (!isset($resultados[$x][$y])) {
$resultados[$x][$y] = ($x + $y) * ($x - y) / 2;
}
// Retorna o resultado calculado
return $resultados[$x][$y];
}
A forma como os parâmetros são indexados no array de resultados pode ser feita de outra maneira. Pode ser feito um hash único dos parâmetros da seguinte forma:
function exemplo($x, $y) {
static resultados = array();
$hash = serialize(func_get_args());
if (!isset($resultados[$hash])) {
$resultados[$hash] = ...
}
return $resultados[$hash];
}
Em alguns casos, pode ser útil forçar que o cálculo seja feito. Isso pode ser controlado por um parâmetro ou por um método, caso esteja tratando de um método de classe:
class exemplo {
static $resultados = array();
public static function calcular($x, $y) {
if (!isset($resultados[$x][$y])) {
self::$resultados[$x][$y] = ...
}
return self::$resultados[$x][$y];
}
public static function limparCache() {
self::$resultados = array();
}
}
Isso pode ocorrer, por exemplo, em um método que devolve o tamanho de uma imagem. A princípio, o valor não precisa ser recalculado, porém, entre uma chamada à função e outra, a imagem pode ter sofrido uma mudança. Para isso, pode-se limpar a cache ou levar em consideração a data de modificação do arquivo no momento que a informação foi obtida. Caso o arquivo não tenha sido modificado, o tamanho da imagem continua o mesmo.
O importante é que o mecanismo para guardar a informação em cache e a indexação não seja muito complexa, caso contrário, o método fica mais lento do que se não fosse otimizado.
1 comentário
Muito interessante. Parabens.
Falou.
Postar um comentário
Nota: fique a vontade para expressar o que achou deste artigo ou do blog.
Dica: para acompanhar as respostas, acesse com uma conta do Google e marque a opção "Notifique-me".
Atenção: o blogger não permite inclusão de tags nos comentários, por isso, use algum site externo para postar seu código com dúvidas e deixe o link aqui. Exemplo: pastebin.com