Heim >Web-Frontend >js-Tutorial >Danke für das Memoize
Wer mich kennt, weiß, dass ich ein absolut beschissenes Gedächtnis habe. Alles andere als ein Monty-Python-Dialog und eine Titelliste einer 90er-Jahre-Alternative-Rockband, und ich bin tot für die Rechte. Zum Glück sind Computer jedoch weitaus kompetenter, wenn es darum geht, sich Dinge zu merken.
Die Technik, mit der wir uns heute befassen, nennt sich Auswendiglernen. Beginnen wir mit der Diskussion reiner Funktionen. Die Idee hinter einer reinen Funktion ist, dass sie unabhängig von der Eingabe immer die gleiche Ausgabe liefert. Überlegen Sie nun, ob Sie eine prozessintensive Funktion haben oder eine, die viel Overhead erfordert. Wenn Sie das Ergebnis der Ausführung der Funktion bereits kennen, wenn ein bestimmter Parametersatz bereitgestellt wird, warum sollten Sie Ihre Ressourcen nutzen, um sie erneut auszuführen? Durch die Memoisierung können wir das Ergebnis einer vorherigen Ausführung einer Funktion speichern und dabei die Parameter dieser Funktion als Schlüssel verwenden. Der folgende Codeausschnitt zeigt, wie eine gespeicherte Funktion aussehen könnte:
const memoize = {}; const getResult = async (n1, n2) => { const key = `${n1}_${n2}`; if (!memoize[key]) { memoize[key] = await resourceIntensiveFunction(n1, n2); } return memoize[key]; };
Werfen wir einen Blick auf den Code. Wir beginnen mit einem Objekt namens memoize, das unsere Parameter und die Ergebnisse als Schlüsselwertsatz speichert. Als nächstes haben wir unsere Funktion namens getResult, die zwei Parameter benötigt: n1 und n2. Der Einfachheit halber gehen wir davon aus, dass die Reihenfolge wichtig ist. Wir werden einen variablen Schlüssel erstellen, indem wir die beiden Parameter verketten.
Jetzt müssen wir prüfen, ob das Memoize-Objekt einen Wert für diesen Schlüssel enthält. Wir überprüfen dies und wenn nicht, haben wir keine andere Wahl, als die ressourcenintensive Funktion auszuführen. Wenn wir die Funktion ausführen, müssen wir die Ergebnisse auch für die zukünftige Ausführung im Memoisierungsobjekt speichern. Wenn Sie diese Funktion das nächste Mal für dieselben Parameter ausführen, findet sie auf diese Weise das Ergebnis im Objekt und überspringt die ressourcenintensive Funktion.
Dies kann in einer Reihe von Szenarien nützlich sein. Wenn Sie beispielsweise eine lange Reihe von Berechnungen haben, die viel Zeit und Ressourcen in Anspruch nehmen, kann sich diese Optimierung als lohnenswert erweisen. Es kann auch nützlich sein, wenn Sie etwas haben, das einen hohen Netzwerkdurchsatz oder viel temporären Speicherplatz erfordert. Für jedes dieser Szenarios gibt es zwei Vorteile: Es entfällt die Notwendigkeit, zuvor ausgeführte Funktionen auszuführen, und es werden Ressourcen für diejenigen frei, die berechnet werden müssen, da sie nicht mit den bereits zugeordneten Funktionen um Ressourcen konkurrieren .
Es gibt Situationen, in denen dies möglicherweise nicht der richtige Ansatz ist. Verwenden Sie dieses Paradigma also nicht immer. Wenn es sich bei Ihrer Funktion nicht um eine reine Funktion handelt und sie sich aufgrund externer Faktoren ändert, sollten Sie diesen Ansatz nicht verwenden, da er Ihnen immer die Werte aus dem ersten Lauf liefert, ohne diese anderen Variablen zu berücksichtigen. Sie sollten dies auch nicht verwenden, wenn die Anwendung die Funktion selten mit demselben Parametersatz ausführt. In diesem Fall verfügen Sie über eine immer größere Datenstruktur, die selten genutzt wird.
Das ist so ziemlich alles zum Auswendiglernen. Es ist ein ziemlich einfaches Muster mit einem sehr einschüchternd klingenden Namen. Es gibt viele Anwendungen dafür und hoffentlich gibt Ihnen das eine bessere Vorstellung davon, was unter der Haube passiert. Wenn Sie mich jetzt entschuldigen würden, muss ich mich daran erinnern, was ich heute Abend tun wollte.
Quellcode auf GitHub verfügbar
Das obige ist der detaillierte Inhalt vonDanke für das Memoize. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!