然而,我特别使用GHC工作。对于我的应用程序来说,常数因素非常重要。内存使用对我也很重要。因此,我有一些关于GHC的问题。
具体而言,
- 如何最大程度地共享节点
- 如何减少内存占用
- 如何避免由于不当的严格/惰性导致的空间泄漏
- 如何让GHC为重要部分的代码生成紧密的内部循环
所以我打开了我最喜欢的数据结构库containers,并查看了Data.Sequence模块。我不能说我理解他们做Seq变快的大部分内容。
首先吸引我眼球的是FingerTree a的定义。我觉得这只是我对finger tree不熟悉。第二件引起我注意的事情是所有的SPECIALIZE pragma。我不知道这里发生了什么,我非常好奇,因为它们在整个代码中都有很多。
许多函数还具有与之关联的INLINE pragma。我可以猜测这意味着什么,但是我如何判断何时内联函数?
在大约第475行左右,有一个标题为“可应用构造”的部分,非常有趣。他们定义了一个新类型包装器来表示Identity单子,编写了自己的严格状态单子的副本,并定义了一个名为applicativeTree
的函数,显然是专门用于Identity单子的,这增加了函数输出的共享率。我不知道这里到底发生了什么。使用了什么魔法来增加共享呢?
无论如何,我不确定从Data.Sequence中有多少可以学习的东西。是否还有其他“样板程序”可以阅读以获取经验?我真的很想知道如何加速我的数据结构。特别是编写易于融合的数据结构,以及如何编写好的融合规则。