czym jest Memoization
Memoization jest techniką optymalizacji, która przyspiesza aplikacje poprzez przechowywanie wyników drogich wywołań funkcji i zwracanie buforowanego wyniku, gdy te same dane wejściowe są ponownie dostarczane.
weźmy przykład, mamy tę metodę obliczania silni liczby za pomocą rekurencji.
function recursiveFac(n) { if (n === 0) { return 1 } else { return n * recursiveFac(n - 1) }}
ta funkcja będzie działać dobrze, ale na dłuższą metę będzie kosztowna. powiedzmy, że jeśli wywoła najpierw memoFac(7), a następnie memoFac (8), bez pamięci podręcznej do przechowywania naszych wcześniej obliczonych wartości, musimy powtórzyć cały proces, zwracając funkcję kolejne 7 razy.
const cache = {}function memoFac(n) { if (cache) { return cache } else { if (n === 0) { cache = 1 } else { cache = n * memoFac(n - 1) } return cache}
mamy więc inną funkcję memoFac () i globalny obiekt pamięci podręcznej, który będzie przechowywał wynik dla tego klucza.
teraz, jeśli wywołamy memoFac(8) po wywołaniu memoFac(7), zapisaliśmy już naszą obliczoną wartość dla silnia (7) w naszym obiekcie „cache”, który został przeniesiony poza funkcję w celu zachowania jej obliczeń buforowania. Tak więc, musimy tylko raz wywołać funkcję, obliczyć 8 * memoFac (7), która wysyła nas prosto do naszego „cache”, aby pobrać buforowaną wartość. Super!
ale poczekaj-jeśli memoizacja ma ten sam ogólny format (pobieranie wartości z pamięci podręcznej w zewnętrznym zakresie funkcji lub obliczanie wartości za pomocą funkcji anonimowego zamykania), czy nie moglibyśmy napisać ogólnej funkcji memoize? Tak, możemy!
koncepcja memoizacji w języku JavaScript opiera się głównie na dwóch koncepcjach.
- zamknięcia
- funkcje wyższego rzędu
function memoizerHoc(fun){ let cache = {} return function (n){ if (cache != undefined ) { return cache } else { let result = fun(n) cache = result return result } }}
Tutaj Mamy funkcję HOC memoizerHoc () i lokalny bufor zmiennych, który może być dostępny wewnątrz zwracanej funkcji (closure).