缓存和记忆有啥区别?
Posted
技术标签:
【中文标题】缓存和记忆有啥区别?【英文标题】:What is the difference between Caching and Memoization?缓存和记忆有什么区别? 【发布时间】:2011-09-22 02:28:57 【问题描述】:我想知道caching
和memoization
之间的实际区别是什么。
在我看来,两者都涉及通过存储数据来避免重复调用函数来获取数据。
两者的核心区别是什么?
【问题讨论】:
我想知道你是否可以说“记忆是缓存”作为“数组是稀疏数组”。换句话说,您只“按需”存储内容,而不是枚举所有可能的输入组合。 【参考方案1】:记忆是一种特殊的缓存形式,它涉及根据函数的参数缓存函数的返回值。
缓存是一个更笼统的术语;例如,HTTP 缓存是缓存而不是记忆。
***says:
虽然与缓存有关,但记忆化指的是这种优化的特定情况,将其与缓存或页面替换等缓存形式区分开来。
【讨论】:
但是您总是可以将缓存与函数一起使用的部分包围起来,并将其命名为“记忆化”。虽然不同之处在于您可以控制函数中的缓存策略,而记忆是更高阶的,并且发生在我猜的函数之外。 为什么 HTTP 缓存不记忆?这也是基于参数(请求的资源的 URL)。 @topomorto:因为If-Match
和过期等功能。记忆化只对纯函数有意义,而 HTTP 很少这样做。
@nicolas,我认为不完全是。我认为在 memoization 中,“函数”一词是在纯/数学意义上使用的。从给定地址下载网页不能被视为函数,因为页面可能会发生变化。
@Alexey 不是同样的评论也适用于缓存吗?所有这些策略都依赖于相同的函数调用,给出相同的结果,也就是没有 upstream 副作用。【参考方案2】:
正如我所看到的那样,“记忆”是“缓存确定性函数的结果”,可以在任何时候在给定相同的函数和输入的情况下重现。
“缓存”基本上包括任何输出缓冲策略,无论源值在给定时间是否可重现。实际上,缓存也用于指代输入 缓冲策略,例如磁盘或内存上的写入缓存。所以这是一个更笼统的术语。
【讨论】:
你确定函数必须是确定性的吗? @German,是的,记忆取决于确定性。经典的例子是递归算法,例如斐波那契数列或阶乘。不是一直重新计算到基本情况,记忆函数会通过重用它已经计算的值的早期结果来短路。这显然取决于相同的输入总是产生相同的输出,这就是确定性的定义。另一方面,缓存经常用于非确定性(例如随机或时间戳)过程,其结果可能与“刷新”值不匹配。【参考方案3】:我认为术语缓存通常用于存储 IO 操作的结果,或者基本上是任何来自外部的数据(文件、网络、数据库查询)。术语记忆通常适用于存储您自己的计算结果,例如在动态编程的上下文中。
【讨论】:
【参考方案4】:记忆是缓存确定性函数结果的一种特殊形式。这意味着在函数外部缓存结果不是记忆,因为函数在计算新结果(不在缓存中)时必须改变缓存,因此它不再是(纯)函数。记忆化通常意味着将缓存作为附加参数(在辅助函数中)传递。记忆化将优化需要为单次访问多次计算值的函数。缓存将优化使用相同参数多次调用的函数。换句话说,无论缓存是否只会优化循环访问,记忆化都会优化第一次访问。
【讨论】:
【参考方案5】:我想补充一下 memoization 也称为 tableing 的其他重要答案。我认为对于那些学习什么是记忆和缓存的人来说,了解这个术语也很重要。
【讨论】:
以上是关于缓存和记忆有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
IIS(动态和静态)缓存、OutPutCache 和浏览器缓存有啥区别
Ehcache中的“缓存未命中”和“内存缓存未命中”有啥区别?
QWebkit QWebSettings 缓存和 QNetworkManager QNetworkDiskCache 有啥区别?