Mémorisation en JavaScript

Une introduction à la mémorisation en JavaScript

La mémorisation est une technique qui vous permet d'accélérer considérablement vos applications.

Ce n'est pas une technique propre à JavaScript, bien que j'aie marqué ce message comme «JavaScript» car je vais fournir quelques exemples JS.

La mémorisation est l'acte de stocker le résultat d'un appel de fonction après son exécution, dans la fonction elle-même. La prochaine fois que nous appelons la fonction, au lieu d'effectuer à nouveau son exécution «régulière», elle nous renvoie simplement le résultat stocké.

C'estmise en cache, pour les fonctions.

Pourquoi est-ce utile?

Supposons que notre fonction prenne 1 seconde pour s'exécuter, tandis que la mise en cache nous permet d'accélérer le processus à 2 millisecondes. Il y a un net gain ici.

Ça a l'air plutôt cool. Où est le piège?

La mémorisation fonctionne si le résultat de l'appel d'une fonction avec le même jeu d'arguments aboutit à la même sortie. En d'autres termes, la fonction doit êtrepur. Sinon, la mise en cache du résultat n'aurait pas de sens.

Ainsi, les requêtes de base de données, les requêtes réseau, l'écriture dans des fichiers et d'autres opérations non pures ne peuvent pas être optimisées avec la mémorisation. Pour ceux-ci, vous devrez trouver d'autres moyens de les optimiser. Ou tout simplement vivre avec leur inefficacité, ce qui est parfois inévitable.

Créons un exemple:

// Calculate the factorial of num
const fact = num => {
  if (!fact.cache) {
    fact.cache = {}
  }
  if (fact.cache[num] !== undefined) {
    console.log(num + ' cached')
    return fact.cache[num];
  } else {
    console.log(num + ' not cached')
  }
  fact.cache[num] = num === 0 ? 1 : num * fact(num - 1)
  return fact.cache[num]
}

calculer la factorielle d'un nombre. La première foisfact()est exécuté, il crée uncachepropriété object sur la fonction elle-même, où stocker le résultat de son calcul.

À chaque appel, si nous ne trouvons pas le résultat du numéro dans lecacheobjet, nous effectuons le calcul. Sinon, nous retournons simplement cela.

Essayez de l'exécuter. J'ai fait un Codepen pour le rendre facile à tester, qui utilisedocument.write()pour imprimer sur la page HTML (première fois que j'ai utilisédocument.write()depuis des lustres, mais cette fois c'était utile).

Voir le styloExemple de mémorisation factoriellepar Flavio Copes (@flaviocopes) surCodePen.

Tech Wiki Online!