.memoize()
Мемоизация функции. Оптимизация. Кэширование для повторного использования кода. Ускорение. Сохранение результатов выполнения функции без повторных вычислений.
Метод util.memoize()
может быть полезен когда какая-либо функция часто (или довольно часто) выполняет те же самые вычисления, которые выполнялись при её предыдущих вызовах;
при повторном вызове не выполняются повторные вычисления. Способ оптимизации математических вычислений. Оптимизация для повторных вычислений. Кэширование.
memoize(fn)
Пример использования memoize()
Выдача результатов функции без повторных вычислений. Пример с функцией для общего видения, которая принимает число в качестве аргумента и возвращает квадрат предоставленного числа:
const myNumSquare = util.memoize(function (num) {
let result = 0
for (let i = 1; i <= num; i++) {
for (let j = 1; j <= num; j++) {
result ++
}
}
return result
})
/* или так
const myNumSqua = num => {
let result = 0
...
}
// производим мемоизацию функции
const myNumSquare = util.memoize(myNumSqua)
*/
console.time("Вызов 1")
console.log(myNumSquare(9123))
console.timeEnd("Вызов 1")
console.time("Вызов 2")
console.log(myNumSquare(9123))
console.timeEnd("Вызов 2")
console.time("Вызов 3")
console.log(myNumSquare(9123))
console.timeEnd("Вызов 3")
Мемоизированный результат. Время ответа с мемоизацией
83229129
Вызов 1: 113.9560546875 ms
83229129
Вызов 2: 0.054931640625 ms
83229129
Вызов 3: 0.055908203125 ms
Для сравнения взглянем на результаты без запоминания вычислений:
const myNumSquare = num => {
let result = 0
for (let i = 1; i <= num; i++) {
for (let j = 1; j <= num; j++) {
result ++
}
}
return result
}
console.time("Вызов 1")
console.log(myNumSquare(9123))
console.timeEnd("Вызов 1")
console.time("Вызов 2")
console.log(myNumSquare(9123))
console.timeEnd("Вызов 2")
console.time("Вызов 3")
console.log(myNumSquare(9123))
console.timeEnd("Вызов 3")
Результат. Время ответа без мемоизации
83229129
Вызов 1: 113.994140625 ms
83229129
Вызов 2: 109.1279296875 ms
83229129
Вызов 3: 110.2490234375 ms
Следующий пример с кешированием данных
Кешированный результат без дополнительных вычислений. Пример с мемоизированной функцией:
const myFun = util.memoize((n) => {
if (n == 1) {
return 1
} else if (n == 2) {
return 1
} else {
return myFun(n - 1) + myFun(n - 2)
}
})
console.time("Вызов")
console.log(myFun(37))
console.timeEnd("Вызов")
Мемоизированный результат. Время ответа с мемоизацией
24157817
Вызов: 0.26904296875 ms
Пример для сравнения без мемоизации:
const myFunN = (n) => {
...
}
console.time("Вызов")
console.log(myFunN(37))
console.timeEnd("Вызов")
Время ответа без мемоизации
24157817
Вызов: 363.347900390625 ms