【问题标题】:Comparison of atom libraries for Haskell, e.g. simple-atom and stringtable-atomHaskell 的原子库比较,例如简单原子和字符串表原子
【发布时间】:2012-02-15 18:59:38
【问题描述】:

我发现自己在我正在开发的 Haskell 程序中需要一个字符串表。特别是,我想要一个允许将任何字符串装入(例如)“原子”的系统;给定一个 Atom,您应该能够恢复它来自的原始字符串,并且(严格地)比较两个 Atom 的相等性应该与指针比较一样快(或几乎一样快)。

(可以很容易地为此功能设计一个引用透明的接口;实现将在内部使用unsafePerformIO,但库的用户不需要知道这些细节。)

Hackage 上提供的两个库似乎在正确的范围内:s​​tringtable-atom 和 simple-atom。有没有人有使用这些库的经验?特别是,您有什么建议可以说明两者相比有什么好处?

【问题讨论】:

  • 如果你打算将它与任何类型的多线程一起使用,我会怀疑这两个包。 stringtable-atom 包使用需要原子执行的 C 代码。 simple-atom 包使用atomicmodifyIORef,但在可以再次调用insert 函数的原子函数内部执行评估。情况不妙。编写线程安全的原子模块必须非常小心。
  • @augustss。的确!这就是为什么我要寻找现成的包装而不是自己动手的一个重要原因。 (事实上​​,我对这个分数的高度谨慎部分是由你不久前关于记忆的精彩博文引起的:)
  • 也许我会上传另一个原子包。
  • 哇!那将是非常友好的,虽然这真的没有必要——我可以尝试自己动手,尽管我的努力肯定不如你这样的大师:-)。如果你正在考虑做一个实现,我觉得理想情况下可以解决的问题不仅仅是字符串;根据实现路线,您可能应该能够使用 Eq 和 Cmp 或使用 Eq 和哈希函数“原子化”任何类型。
  • 我已经有一个实现,但需要一些清理和调整。

标签: haskell


【解决方案1】:

另一个不错的选择是 ekmett 的新实习生包,它可以处理字节串以及更复杂的递归类型:http://hackage.haskell.org/package/intern

他向我保证这是线程安全的。

【讨论】:

  • intern 的实现使用 (a) 弱引用和 (b) unsafeDupableIO。 (a) 如果你有很多 GC,可能会减慢 GC。关于(b)我很想在代码中看到一条评论,描述它为什么是安全的。 (使用 unsafePerfomIO + NOINLINE 肯定会更安全,但更慢。)
  • @nominolo:我相信弱引用的目的是确保字符串在不再可见时被解除。至少对于某些应用来说,这是一个重要的特性;如果没有weakRefs,它就无法实现。在其他应用程序中,这可能是一种浪费的开销——这也是各种库和选项很有帮助的另一个原因。
  • @nominolo:关于您的观点 (b),您是否碰巧知道一个很好的指南,它可以准确地告诉您确保 unsafePerformIO 安全所需的内容?为什么/何时需要 NOINLINE 来确保引用的透明度/安全性?
【解决方案2】:

我写了monad-atom 供我自己使用。如果您需要全局唯一的原子,这不是您想要的,但如果您只需要一个字符串表,那么它既简单又安全。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    相关资源
    最近更新 更多