【问题标题】:fixed length circular buffer in haskellHaskell中的固定长度循环缓冲区
【发布时间】:2011-06-28 16:52:49
【问题描述】:

我想在 Haskell 中创建一些通用类型的固定长度的循环缓冲区。缓冲区中的项目需要在物理内存(不是链表)中一个接一个地定位。我想要这个特定的结构,因为它会提高所有数据一起进入 CPU 上的二级缓存的机会。我已经阅读了有关 Haskell 如何允许新数据类型的信息,但是看起来使用“数据”创建的类型与使用模式匹配和相关方法美化的 c 结构差不多。是否有可能完全在 Haskell 中创建像上面描述的那样的低级数据结构。

【问题讨论】:

  • 在 Haskell 中很难进行低级推理。恕我直言,最好将 C 用于您想要挤出最后一滴性能的任务。
  • 我想知道Data.Sequence 与这样的数据结构相比如何。
  • @Dan Burton:奇怪的是,我不久前测试过这个。使用 Data.Sequence 通常是性能最好的选项,并且(非常令人惊讶)通常优于未装箱的可变数组。即使在病态的情况下(从序列中间进行大量读取),性能也不会比可变缓冲区差多少。我对这个结果感到非常惊讶,我仍然不确定我是否相信它,但我认为我在测试中没有犯任何错误。
  • @John L:你应该写一篇关于你的发现的博文。我,一方面,会读它。

标签: haskell


【解决方案1】:

您想要一个类似数组的可变结构,并且您特别想要一个未装箱的结构,以便底层数组不仅存储指向数据的指针,还存储项目本身。

标准数组库中的 Data.Array 为您提供了一个版本,但向量库中提供了特别高性能的数组:http://hackage.haskell.org/package/vector

向量库,如 ByteString、Text 和其他一些库,在底层使用了大量的低级 ghc 特定原语。仅使用该库,您不必自己担心这些事情。但是,如果您认为该库没有为您提供所需的东西,那么您也可以通过自己阅读其源代码来学习相当多的技巧和技巧。

【讨论】:

  • Data.Vector 的另一个不错的特性是将 Data.Vector.Storable 数组传递给 C 库相对简单。
  • 查看黑客包vector-buffer
【解决方案2】:

是的,这当然是可能的。 Real World Haskell 中的章节creating a bloom filter 应该是此类实现的一个很好的例子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    相关资源
    最近更新 更多