我是 clojure 的新手,我刚刚学习并尝试了记忆功能。在我看来,这个功能的存在很奇怪。
首先具有副作用的函数以 !
其次使用记忆非常简单
为什么 clojure 不为我做这个?内存使用和性能之间存在平衡,但您可以轻松地让 clojure 运行时将一大块内存分配给函数结果。如果使用相同参数多次调用函数,则使用缓存结果,如果内存耗尽,则清除缓存并跟踪缓存命中,因此频繁调用的函数不太可能从缓存中删除。
如果我设计了这个,我什至会为函数设置一个最低性能级别,这样如果函数调用比缓存检索更快,它就不会被缓存。(或者将其作为所有函数调用工作方式的属性。)
谁能解释为什么 clojure 不这样做
谢谢
计算机科学中有一个古老的笑话,只有两个难题:
内置memoize
函数是其功能的良好开端,在某些情况下它非常有用且足够。然而,它确实很适合上面的笑话。这是一个有点尴尬的名字(这里的意见)并且它在缓存失效时非常失败。它假设如果一个函数曾经被调用过,结果将始终是相关的,并且该函数是纯函数,并且不会遇到错误,并且所有调用在所有时间都是同等相关的。现实世界充满了对缓存非常重要的细微差别:
memoize
实际上并不能保证一个函数只运行一次。 例如,在为 Web 应用程序设计缓存时,所有这些事情都会发挥作用。#5 是一个有趣的例子,考虑如果你memoize
的函数很慢,并且一秒钟内有两次调用它会发生什么。哪个返回值成为记忆结果?在什么情况下这很重要。这些细节真的很重要,尤其是当其中一个细节遇到异常情况时。
在过去的八年专业做 clojure 的过程中,我似乎在生产中多次使用了 memoize,一旦不可避免的问题出现,它总是被调用clojure.core.cache 中的一个函数在短时间内替换。
如果您发现自己想要memoize
,那么您很有可能对 core.cache 更满意。它提供了更多细微差别的选项,以适应更多的现实世界案例。
归档时间: |
|
查看次数: |
1310 次 |
最近记录: |