@roman9966

Почему иммутабельные данные легче кэшировать?

Есть пример:
var step_1 = Immutable({
   data : {
      value : 0
   }
});
var step_2 = step_1.setIn(['data', 'value'], 1);
var step_3 = step_2.setIn(['data', 'value'], 0);
step_1.data === step_3.data; //false

Данные в объекте data не отличаются, но сам объект data уже другой. Так почему иммутабельные данные легче кэшировать?
  • Вопрос задан
  • 532 просмотра
Решения вопроса 1
@beh
Разработчик python, javascript
Рискну предположить что имеется ввиду кэширование в контексте чистых функций.
Если функция чистая то можно гарантировать при вызове функции с одними и теми же аргументами мы всегда получим одинаковый результат: выходные данные зависят только от входных. А безопасно закешировать результат можно в том случае если аргументы имутабельны.

Например у нас есть чистая функция для расчета чисел Фибоначчи, мы можем обернуть ее функцией memoize из lodash чтобы кешировать результат:
// агрумент n является примитивом, а примитив имутабелен
let fibonacci = _.memoize(function(n) {
  return n < 2 ? n: fibonacci(n - 1) + fibonacci(n - 2);
});

console.time('first call');
console.log(fibonacci(50));
// => 12586269025
console.timeEnd('first call');
// => first call: 2.508ms

console.time('second call');
console.log(fibonacci(50));
// => 12586269025
console.timeEnd('second call');
// => second call: 0.300ms

codepen

В примере выше функция принимает примитив, а он всегда имутабелен, и проблем нет.
Теперь напишем пример где в кеширующую функцию можно подавать не имутабельные данные
let cachedFn = _.memoize((arr) => arr.length);

let arr = [1,2,3];
console.log(cachedFn(arr));
// => 3
arr.push(4);
console.log(cachedFn(arr));
// => 3 - !!!
console.log(cachedFn([...arr]));
// => 4

codepen
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы