.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