Haskell:如何"缓存"友好是Lazy Eval /需要调用

use*_*543 17 caching haskell lazy-evaluation call-by-need

我在业余时间学习Haskell已经有几个月了.我想知道Haskell如何在当前库存硬件上执行内存子系统(L1,L2,L3缓存).有人可以指点我关于缓存友好是Haskell的任何报告/研究,因为它的懒惰评估/按需调用?有没有办法让我们获取有关发生了多少数据缓存未命中和指令缓存未命中的信息,看看这是否是由于该语言的惰性评估性质?

谢谢.

Ben*_*rer 1

这是运行时值表示的主要问题。Haskell 中的大多数类型都是“提升的”,即它们可能包含bottom. 实际上,这意味着 EvenInt由指针表示,要么指向机器 Int 要么指向计算(可能会发散,即 b bottom)。

这是关于盒装与提升(与原始)的快速入门。即,Array#未提升,因为它可能不是底部,但它被装箱,因为它可能包含提升的值。

那么这与非严格评估有什么关系呢?未评估的计算称为“thunk”。对于缓存局部性来说,拥有一个指向 Int 的指针链表比拥有一个紧凑的机器整数数组要糟糕得多,追逐指向 thunk 的指针也是如此。

这就是为什么有大量的研究和工程按需分析——如果无论如何都需要计算的值,那么它可以变得严格。

AFAIK,“boxity”分析是需求分析的一部分。不管怎样,GHC 会尽可能地摆脱指针。

但不幸的是我没有任何这方面的经验数据或研究。

编辑:关于严格性/盒子分析的更多阅读:

GHC-严格性

GHC 中的需求分析器

SO 理查德·艾森伯格 (Richard Eisenberg) 的回答,对“轻浮”(提升/未提升)、底部和 进行了更多澄清undefined

编辑2:

找到一篇 2002 年的论文: Nethercote, Mycroft;库存硬件上大型惰性函数程序的缓存行为