"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Impede a reexecução de grandes funções javascript que foram processadas uma vez com o mesmo parâmetro.

Impede a reexecução de grandes funções javascript que foram processadas uma vez com o mesmo parâmetro.

Publicado em 2024-08-29
Navegar:662

Prevents re-execution of large javascript functions that have been processed once with the same parameter.

memorizar

Mecanismo de cache (memoizer) para funções executadas com os mesmos parâmetros (apenas 1,14 KB)

Este projeto fornece uma função memoize para melhorar o desempenho em projetos JavaScript ou TypeScript, armazenando em cache os resultados de chamadas de função caras. Ao memorizar, chamadas repetidas com os mesmos argumentos retornarão o resultado armazenado em cache, acelerando a execução.

Este módulo funciona como o gancho useMemo do react, mas NÃO é necessário reagir. Você pode usar qualquer framework ou projetos javascript puro

Pacote Npm
Github

Características

  • Memoização de função: armazena em cache os resultados de chamadas de função com os mesmos argumentos.
  • Rastreamento de Dependências: atualiza o cache se as dependências mudarem.
  • Flexibilidade: utilizável em projetos JavaScript e TypeScript.
  • A melhor solução para operações com uso intensivo de CPU ou cálculos complexos
  • As funções desconectadas são excluídas da memória. Os caches pertencentes a esta função também são excluídos.
  • Armazenamento de cache baseado em WeakMap
  • WeakMap Desconecta métodos que não conseguem se comunicar com links de referência fracos e aciona o coletor de lixo para entrar em ação

Caso de uso

Sem parâmetros de dependência

No processo a seguir, quando o método concatPhoneNumber é chamado novamente com os mesmos parâmetros, a função não é executada novamente, ela busca o resultado no cache.

import memofy from "memofy";

const concatPhoneNumber = (extension, number) => {
  // Heavy calculation
  // return result
};

const memoizedConcatPhoneNumber = memofy(concatPhoneNumber, []);

memoizedConcatPhoneNumber(90, 555); // Runs concatPhoneNumber when first run
memoizedConcatPhoneNumber(90, 555); // get value from cache

memoizedConcatPhoneNumber(90, 552); // Runs concatPhoneNumber because params is change

Com parâmetro deps

Se você deseja que o método seja executado novamente com o mesmo parâmetro de acordo com algumas dependências, você pode passar o parâmetro deps da seguinte forma.

import memofy from "memofy";

const taxRatio = 0.5;
const product = { title: "Test product", price: 10 };

const calculateTax = () => {
  // Calculate tax by product price
  // Heavy calculation
  return taxRatio * product.price;
};

const memoizedConcatPhoneNumber = memofy(calculateTax, [product, taxRatio]);

calculatedPrice = calculateTax(); // Runs concatPhoneNumber when first run

product.price = 40;
let calculatedPrice = calculateTax(); // Runs concatPhoneNumber because product dep changed

taxRatio = 0.8;
calculatedPrice = calculateTax(); // Runs concatPhoneNumber because taxRatio changed

Resultado de desempenho

Resultados de desempenho em uma função complexa que distingue números primos. Teste de desempenho

Caso EM
Hora da primeira execução (sem cache) > 52,08ms
Segundo tempo de execução (armazenamento em cache)
e execução subsequente (armazenamento em cache)

Resultado de cobertura do teste

Os testes foram escritos para todos os casos e todos os tipos de parâmetros. Testes

Arquivo % Stmts % Filial % Funções % Linhas Números de linhas descobertas
Todos os arquivos 100 100 100 100 0
lib 100 100 100 100 0
index.ts 100 100 100 100 0
lib/loja 100 100 100 100 0
CacheStore.ts 100 100 100 100 0
DepsStore.ts 100 100 100 100 0
Declaração de lançamento Este artigo está reproduzido em: https://dev.to/ahmetilhn/prevents-re-execution-of-large-javascript-functions-that-have-been-processed-once-with-the-same-parameter-1ici? 1, pois se houver alguma violação, entre em contato com [email protected] para excluí-la.
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3