Maison  >  Article  >  interface Web  >  Empêche la réexécution de grandes fonctions javascript qui ont été traitées une fois avec le même paramètre.

Empêche la réexécution de grandes fonctions javascript qui ont été traitées une fois avec le même paramètre.

WBOY
WBOYoriginal
2024-08-28 06:08:06476parcourir

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

mémoriser

Mécanisme de cache (memoizer) pour les fonctions exécutées avec les mêmes paramètres (seulement 1,14 Ko)

Ce projet fournit une fonction de mémorisation pour améliorer les performances des projets JavaScript ou TypeScript en mettant en cache les résultats d'appels de fonctions coûteux. En mémorisant, les appels répétés avec les mêmes arguments renverront le résultat mis en cache, accélérant ainsi l'exécution.

Ce module fonctionne comme le hook useMemo de React, mais il n'est PAS nécessaire de réagir. Vous pouvez utiliser n'importe quel framework ou projets javascript purs

Forfait Npm
Github

Caractéristiques

  • Mémoisation de fonction : met en cache les résultats des appels de fonction avec les mêmes arguments.
  • Suivi des dépendances : met à jour le cache si les dépendances changent.
  • Flexibilité : utilisable dans les projets JavaScript et TypeScript.
  • La meilleure solution pour les opérations gourmandes en CPU ou les calculs complexes
  • Les fonctions déconnectées sont supprimées de la mémoire. Les caches appartenant à cette fonction sont également supprimés.
  • Magasin de cache basé sur WeakMap
  • WeakMap déconnecte les méthodes qui ne peuvent pas communiquer avec des liens de référence faibles et déclenche l'intervention du garbage collector

Cas d'utilisation

Sans paramètres deps

Dans le processus suivant, lorsque la méthode concatPhoneNumber est à nouveau appelée avec les mêmes paramètres, la fonction n'est pas réexécutée, elle récupère le résultat du 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

Avec paramètre deps

Si vous souhaitez que la méthode s'exécute à nouveau avec le même paramètre selon certaines dépendances, vous pouvez passer le paramètre deps comme suit.

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

Résultat des performances

Résultats de performances sur une fonction complexe qui distingue les nombres premiers. Test de performances

Case ms
First execute time (no caching) > 52.08 ms
Second execute time (caching) < 0.03 ms
and subsequent execution (caching) < 0.03 ms

Résultat de couverture du test

Des tests ont été écrits pour tous les cas et tous les types de paramètres. Essais

File % Stmts % Branch % Funcs % Lines Uncovered Line #s
All files 100 100 100 100 0
lib 100 100 100 100 0
index.ts 100 100 100 100 0
lib/store 100 100 100 100 0
CacheStore.ts 100 100 100 100 0
DepsStore.ts 100 100 100 100 0

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn