【发布时间】:2015-07-02 20:23:24
【问题描述】:
现代 CPU 已经过优化,因此访问和修改内存中的同一位置(时间局部性)以及内存中的连续位置(空间局部性)是非常快速的操作。
现在,由于 Haskell 是一种纯粹不可变的语言,你自然不能覆盖现有的内存块,这可能会使像 foldl 这样的事情比在 C 中连续访问结果变量的 for 循环慢得多。
Haskell 是否在内部采取任何措施来减轻这种性能损失?总的来说,它关于局部性的属性是什么?
【问题讨论】:
-
当然 Haskell 没有指定这一点 - 所以它取决于实现(很可能是 GHC),我认为它足够 smart 编译像
foldl这样的东西进入一个循环(如果不是 GHC 本身,甚至后端都可以管理) - 但我真的只是在猜测 - 当然您可以随时自己尝试并查看输出;)跨度> -
读取仍然受益于局部性。在合适的 monad 中,可变数组应该具有与命令式语言相同的性能。不可变数据结构当然不允许简单的就地修改。在某些情况下,GHC 可能会对此进行优化(例如,紧密的数字循环不会在每次迭代时分配新的整数)。 OTOH,具有不变性极大地有助于并行化您的代码,而不会导致频繁的缓存失效。
标签: performance haskell memory