JS-Memoization-Bibliotheken: Wie schnell (oder langsam) sie wirklich sind
Memoisierung ist eine Optimierungstechnik, die dazu dient, teure Funktionsaufrufe durch Zwischenspeichern ihrer Ergebnisse zu beschleunigen. Dies ist nützlich, wenn Funktionen mehrmals mit denselben Argumenten aufgerufen werden.
Es gibt viele JavaScript-Memoisierungsbibliotheken und die Wahl der richtigen für Ihren Anwendungsfall kann einen großen Leistungsunterschied für Ihre Anwendung bewirken.
Ein Problem besteht darin, die Leistung Ihrer Memorisierung zu bewerten und zu bewerten – und das ist definitiv keine triviale Sache. Wir werden einen Blick darauf werfen, wie ein Benchmarking für eine Vielzahl von Anwendungsfällen sinnvoll durchgeführt werden kann. Wir haben uns eingehend damit beschäftigt und am Ende unser eigenes Benchmarking und eine Memoisierungsbibliothek namens „sonic-memoize“ geschrieben.
Memoisierungsstrategien können in zwei Kategorien unterteilt werden: solche mit Cache-Invalidierung (oder Cache-Größenbeschränkung) und solche ohne. Es ist sinnvoll, sie separat zu bewerten, da Sie wahrscheinlich das eine oder das andere benötigen und sie unterschiedliche Leistungsprofile haben.
Memoisierung ohne Cache-Größenbeschränkung
Das Speichern ohne Cache-Größenbeschränkung kann einfach und sehr schnell erfolgen. Alle eingehenden Funktionsaufrufe werden im Cache gespeichert, egal wie viele es sind. Der Nachteil einer fehlenden Cache-Größenbeschränkung besteht darin, dass der Cache unbegrenzt wachsen kann und viel Speicher verbraucht. In den meisten Anwendungsfällen ist es jedoch wahrscheinlich nicht erforderlich, eine Größenbeschränkung für Ihren Cache festzulegen, es sei denn, Sie haben strenge Speicherbeschränkungen oder rufen Ihre gespeicherte Funktion millionenfach mit unterschiedlichen Argumenten auf.
Sie sollten Folgendes testen:
- Wie lange dauert es, neue Funktionsaufrufe zu verarbeiten, die sich noch nicht im Cache befinden (und sie für spätere Aufrufe zu speichern)?
- Wie lange es dauert, zuvor aufgerufene Funktionsaufrufe aus dem Cache zu lesen
- Funktionen mit einem einzelnen Parameter und mit mehreren Parametern sowie mit verschiedenen Parametertypen
Weitere Benchmarking-Ergebnisse und die Details zum Setup finden Sie hier:https://github.com/Animus-Blue/memoization-benchmarking#benchmark-results
Memoisierung mit Cache-Größenbeschränkung
Die Memoisierung kann mit einer LRU-Caching-Strategie (zuletzt verwendet) implementiert werden. Das heißt, sobald der Cache voll ist, wird das zuletzt verwendete Element gelöscht. Dadurch wird die Speichernutzung begrenzt und Sie haben trotzdem eine gute Chance, dass benötigte Funktionsaufrufe zwischengespeichert werden. Der Nachteil einer LRU-Cache-Größenbeschränkung besteht darin, dass sie mit Leistungseinbußen verbunden sein kann (obwohl diese bei ordnungsgemäßer Implementierung nicht enorm sind).
Sie sollten Folgendes testen:
- Wie lange es dauert, neue Funktionsaufrufe (oder solche, die aus dem Cache gelöscht wurden) zu verarbeiten – insbesondere, wenn der Cache voll ist. Auf diese Weise testen Sie, ob ein neues Element hinzugefügt und gleichzeitig ein vorhandenes Element entfernt wird.
- Wie lange dauert es, Funktionsaufrufe zu lesen, die sich noch im Cache befinden?
- Funktionen mit einem einzelnen Parameter und mit mehreren Parametern sowie mit verschiedenen Parametertypen
Weitere Benchmarking-Ergebnisse und die Details zum Setup finden Sie hier:https://github.com/Animus-Blue/memoization-benchmarking#benchmark-results
Bitte zögern Sie nicht, einen Kommentar abzugeben oder Kontakt mit uns aufzunehmen, wenn Sie Fragen haben oder einfach nur über Softwareentwicklung und -optimierungen sprechen möchten.

![Was ist überhaupt eine verknüpfte Liste? [Teil 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































