GHCI似乎在交互式会话期间缓存函数的结果。这很容易注意到,只需调用一个耗时的函数两次。第二次,结果会立即出现。
有没有办法从GHCI中清除这个缓存,这样我就不需要重新启动它了?我正在做一些快速的、不详细的性能比较,所以使用System.CPUTime将是一种过度的杀伤力。
发布于 2013-03-19 04:39:15
您可以随时通过命令:r重新加载您正在使用的模块。这将丢弃您所做的任何交互式绑定,如果您只是随便看看,这可能并不总是实用的。如果你没有实际使用一个模块,这也是可行的。
发布于 2013-03-19 03:15:38
正如注释所指出的,您正在使用let将一个名称绑定到一个值,该值是应用函数的结果。如果你想保持值不变,不要在let中命名它!(或者只是不引用你已经在let中计算的值)。
发布于 2013-03-21 06:33:28
GHCi有一个+r选项,according to the manual应该可以执行您想要的操作:
通常,在加载的模块中对顶级表达式(也称为CAF或常量应用形式)的任何求值都会在求值之间保留。启用
+r会导致在每次求值后丢弃顶级表达式的所有求值(它们在单个求值过程中仍会保留)。
如果计算的顶级表达式占用大量空间,或者您需要可重复的性能测量,则此选项可能会有所帮助。
请注意,它讨论的是constant applicative forms,而不是函数。但是,我无法让它在您的示例中工作:
Prelude> :set +r
Prelude> :set +s
Prelude> let f = 1 : map (2*) f
(0.01 secs, 1222216 bytes)
Prelude> last $ show $ f !! 100000
'6'
(3.54 secs, 641914476 bytes)
Prelude> last $ show $ f !! 100000
'6'
(0.04 secs, 1634552 bytes)
Prelude> last $ show $ f !! 100000
'6'
(0.04 secs, 1603568 bytes)很明显,+r only works for compiled code,尽管医生没有提到这一点。
https://stackoverflow.com/questions/15483752
复制相似问题