【发布时间】:2011-09-19 21:50:56
【问题描述】:
所以有时我需要编写一个在 Hackage 上找不到的数据结构,或者我发现的数据结构没有经过测试或质量不足以让我信任,或者这只是我不想成为依赖项的东西。我现在正在阅读冈崎的书,它很好地解释了如何设计渐近快速的数据结构。
但是,我专门与 GHC 合作。常数因素对我的应用程序来说很重要。内存使用对我来说也很重要。所以我有一些关于 GHC 的问题。
特别是
- 如何最大限度地共享节点
- 如何减少内存占用
- 如何避免因不适当的严格/懒惰导致的空间泄漏
- 如何让 GHC 为重要的代码部分生成紧密的内部循环
我浏览了网络上的各个地方,我对如何使用 GHC 有一个模糊的想法,例如,查看核心输出、使用 UNPACK pragmas 以及喜欢。但我不确定我是否明白。
所以我打开了我最喜欢的数据结构库、容器,然后查看了 Data.Sequence 模块。我不能说我了解他们为加快 Seq 所做的很多工作。
首先引起我注意的是FingerTree a的定义。我想这只是我对手指树不熟悉。引起我注意的第二件事是所有SPECIALIZE 编译指示。我不知道这里发生了什么,我很好奇,因为这些代码到处都是。
许多函数还具有与之关联的INLINE pragma。我可以猜到这意味着什么,但我如何判断何时调用 INLINE 函数?
在 ~475 行,标题为“应用构造”的部分变得非常有趣。他们定义了一个新类型的包装器来表示 Identity monad,他们编写了自己的严格状态 monad 的副本,并且他们定义了一个名为 applicativeTree 的函数,它显然是专用于 Identity monad 的,这增加了功能。我不知道这里发生了什么。什么巫术被用来增加分享?
无论如何,我不确定是否可以从 Data.Sequence 中学到很多东西。我可以阅读其他“示范程序”来获得智慧吗?当我真的需要它们更快时,我真的很想知道如何增强我的数据结构。特别是一件事是编写使融合变得容易的数据结构,以及如何编写好的融合规则。
【问题讨论】:
-
如果我没记错的话,这个问题的标准答案是“将您的问题添加到 the language benchmarks game 并等待 Don 为您优化它”。 ;]
-
哈哈哈。也许我应该吃掉 Dons,从而获得他创造与 C 竞争的 Haskell 代码的不可思议的力量。