Чим відрізняється кешування від пам'яті?


114

Я хотів би знати , що фактична різниця між cachingі memoizationє.
Як я бачу, обидва передбачають уникати повторних викликів функцій для отримання даних, зберігаючи їх .

У чому суть різниці між ними?


Цікаво, чи можна сказати "запам'ятовування - це кешування", як "масив - це розріджений масив". Іншими словами, ви зберігаєте лише речі "на вимогу", а не перераховуєте всі можливі комбінації введення.
Шрідхар Сарнобат

Відповіді:


110

Пам'ять - це специфічна форма кешування, яка включає кешування поверненого значення функції на основі її параметрів .

Тренування - більш загальний термін; наприклад, кешування HTTP - це кешування, але не запам'ятовування.

У Вікіпедії сказано :

Хоча пов'язане з кешуванням, запам'ятовування відноситься до конкретного випадку цієї оптимізації, відрізняючи її від таких форм кешування, як буферизація або заміна сторінки.


2
але ви завжди можете передати частину, де використовується кеш-пам'ять з функцією, і охрестили її «запам'ятовуванням». хоча різниця полягає в тому, що ви керуєте політикою кешування у своїй функції, тоді як запам'ятовування є вищим порядком і відбувається поза функцією, на яку я здогадуюсь.
Ніколас

Чому кешування HTTP не запам'ятовування? що також базується на параметрі (URL-адреса запитуваного ресурсу).
Топо Відновити Моніку

@topomorto: Через такі функції, як If-Matchі термін дії. Пам'ять має сенс лише для чистої функції, якою HTTP рідко є.
СЛАкс

@nicolas, не зовсім, я думаю. Я думаю, що при запам'ятовуванні термін «функція» вживається в чистому / математичному значенні. Завантаження веб-сторінки з вказаної адреси не можна вважати функцією, оскільки може трапитися зміна сторінки.
Олексій

@Alexey не однакове зауваження стосується кешування? всі ці стратегії ґрунтуються на той же функцію виклику дає той же результат, інакше не вгору по течії побічного ефекту.
Ніколас

47

Як я бачив, як вони їх використовували, "запам'ятовування" - це "кешування результату детермінованої функції", яке може бути відтворене в будь-який час, отримавши ту саму функцію та входи.

"Кешування", в основному, включає будь-яку стратегію буферизації вихідних даних, незалежно від того, значення джерела можна відтворити в даний момент часу. Насправді кешування також використовується для позначення стратегій буферизації вхідних даних , таких як кеш-запис на диск або пам'ять. Так що це набагато більш загальний термін.


Ви впевнені, що функція повинна бути детермінованою?
Герман

4
@ Герман, так, запам'ятовування залежить від детермінізму. Класичний приклад - рекурсивний алгоритм, такий як послідовність Фібоначчі або факториал. Замість повторних обчислень аж до базового випадку запам'ятована функція мала б коротке замикання шляхом повторного використання попередніх результатів для значень, які вже обчислені. Це, очевидно, залежить від того самого вкладу, який завжди дає однаковий результат, що є визначенням детермінізму. Кешування, з іншого боку, часто використовується для недетермінованих (наприклад, випадкових чи часових) процесів, з розумінням того, що результати можуть не відповідати "оновленому" значенню.
harpo

6

Я думаю, що термін кешування зазвичай використовується, коли ви зберігаєте результати операцій вводу-виводу або в основному будь-які дані, які надходять до вас ззовні (файли, мережа, db-запити). Запам'ятовування термінів зазвичай стосується зберігання результатів власних обчислень, наприклад в контексті динамічного програмування.


1

Пам'ять - це особлива форма кешування результату детермінованої функції. Це означає, що кешування результату поза функцією не є запам'ятовуванням, тому що функція повинна мутувати кеш під час обчислення нового результату (ще не в кеші), тому це більше не буде (чистою) функцією. Пам'ять зазвичай передбачає передачу кешу як додатковий аргумент (у функції помічника). Пам'ять оптимізує функції, яким потрібно обчислити значення кілька разів для одного доступу. Кешування оптимізує функції, які викликаються кілька разів з однаковими параметрами. Іншими словами, Memoization оптимізує перший доступ, чи кешування буде оптимізувати лише періодичні звернення.


0

Я хотів би додати до інших чудових відповідей, що запам'ятовування також відоме як табл . Я думаю, що також важливо знати цей термін для тих, хто дізнається, що таке запам'ятовування та кешування.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.