Lodash Memoize. Como fazer?
Chamar um método ou função várias vezes para obter o mesmo retorno pode ser custoso para um programa. Dependendo da complexidade desse método, pode ser interessante fazer caching do resultado. Assim, economiza-se recursos e melhora-se o desempenho da aplicação. Neste post irei mostrar como usar a função memoize do Lodash para fazer cache do resultado de uma outra função.
Usando o memoize
Para facilitar o entendimento considere um exemplo de uma simples função para adição de dois números.
// uma simples função de adição
const add = (n, m) => {
return n + m;
}
Para usar o memoize nesta função, basta passá-la como parâmetro pra outra função.
// addWithMemo usa o memoize com a função add
const addWithMemo = _.memoize(add);
Um ponto crítico a salientar: o memoize utiliza somente o primeiro parâmetro da função como chave na cache.
No nosso exemplo, em caso de sucessivas chamadas, quando repetimos o valor do primeiro argumento e mudamos apenas o segundo, a adição não será de fato processada. O resultado será retornado a partir da cache, porém, estará errado.
Então, para contornar esse problema podemos utilizar um resolver.
O resolver concatena todos os argumentos para criar uma string única. Assim, toda vez que o mesmo conjunto de argumentos for utilizado, memoize
retornará o resultado da cache.
const secureAddWithMemo = _.memoize(add, (...args) => _.values(args).join("_"));
Veja funcionando no codepen
Quando usar memoize ?
Essa técnica não deve ser utilizada deliberadamente em todas as funções. Algumas considerações:
Para ser viável a função deve ser pura, ou seja, ter sempre o mesmo retorno para os mesmos parâmetros de entrada.
Há ganho somente para funções que tem argumentos com um intervalo limitado de valores. Assim os valores em cache serão usados com mais frequência.
Pode parecer interessante fazer cache de requisições API, no entanto isso não é necessário, uma vez que o navegador faz isso automaticamente. Veja HTTP caching para maiores detalhes.
O melhor cenário para uso de memoize é com fuções computacionais pesadas. São essas que podem ter um ganho significativo de desempenho.
Caso tenha interesse em entender um pouco mais sobre a técnica memoize, deixo como referência esse post que também serviu de referência para este.
Se você achou este post útil, deixe seu comentário ou sugestão. Abraços!