Ceux d'entre vous qui me connaissent savent que j'ai un souvenir absolument nul. Tout ce qui est en deçà du dialogue Monty Python et de la liste des morceaux d'un groupe de rock alternatif des années 90 et je suis mort de plein droit. Heureusement pour nous, les ordinateurs sont bien plus compétents lorsqu'il s'agit de mémoriser des choses.
La technique que nous examinons aujourd'hui s'appelle la mémorisation. Commençons par discuter des fonctions pures. L’idée derrière une fonction pure est que, quelle que soit l’entrée que vous lui donnez, elle donnera toujours le même résultat. Déterminez maintenant si vous avez une fonction gourmande en processus ou une fonction qui nécessite beaucoup de frais généraux. Si vous connaissez déjà le résultat de l'exécution de la fonction lorsqu'un certain ensemble de paramètres vous est fourni, pourquoi utiliser vos ressources pour l'exécuter à nouveau. La mémorisation nous permet de stocker le résultat d'une exécution précédente d'une fonction en utilisant les paramètres de cette fonction comme clé. L'extrait de code suivant montre à quoi pourrait ressembler une fonction mémorisée :
const memoize = {}; const getResult = async (n1, n2) => { const key = `${n1}_${n2}`; if (!memoize[key]) { memoize[key] = await resourceIntensiveFunction(n1, n2); } return memoize[key]; };
Jetons un coup d'oeil au code. Nous commençons par un objet appelé memoize qui stockera nos paramètres et les résultats sous forme d'ensemble de valeurs clés. Nous avons ensuite notre fonction appelée getResult qui prend deux paramètres : n1 et n2. Par souci de simplicité, supposons que l'ordre compte. Nous allons créer une clé variable en utilisant la concaténation des deux paramètres.
Maintenant, nous devons vérifier si l'objet memoize contient une valeur pour cette clé. Nous vérifions et, si ce n'est pas le cas, nous n'avons d'autre choix que d'exécuter la fonction gourmande en ressources. Si nous exécutons la fonction, nous devons également stocker les résultats dans l'objet de mémorisation pour une exécution future. De cette façon, la prochaine fois que vous exécuterez cette fonction pour ces mêmes paramètres, elle trouvera le résultat dans l'objet et ignorera la fonction gourmande en ressources.
Cela peut être utile dans un certain nombre de scénarios. Si, par exemple, vous avez une longue série de calculs qui nécessitent beaucoup de temps et de ressources, cette optimisation en vaut la peine. Cela peut également être utile si vous disposez d'un élément nécessitant un débit réseau élevé ou beaucoup d'espace disque temporaire. Pour chacun de ces scénarios, l'avantage est double : il élimine le besoin d'exécuter des fonctions qui ont été précédemment exécutées et il libère des ressources pour celles qui doivent être calculées, car elles ne sont pas en concurrence pour les ressources avec les fonctions déjà mappées. .
Il y a des situations où cela pourrait ne pas être la bonne approche, alors n'utilisez pas toujours ce paradigme. Si votre fonction n'est pas une fonction pure et qu'elle change en fonction de facteurs externes, vous ne souhaitez pas utiliser cette approche car elle vous donnera toujours les valeurs de la première exécution sans prendre en compte ces autres variables. Vous ne souhaitez pas non plus l'utiliser si l'application exécute rarement la fonction avec le même ensemble de paramètres. Dans ce cas, vous disposerez d'une structure de données de plus en plus volumineuse et rarement utilisée.
C'est à peu près tout pour la mémorisation. C'est un modèle assez simple avec un nom à consonance très intimidant. Il existe de nombreuses applications et, espérons-le, cela vous donnera une meilleure idée de ce qui se passe sous le capot. Maintenant, si vous voulez bien m'excuser, je dois me rappeler ce que j'allais faire ce soir.
Code source disponible sur GitHub
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!