31

有一个具有惰性和严格实现的数据结构列表:

  • Data.Map.LazyData.Map.Strict
  • Data.IntMap.LazyData.IntMap.Strict
  • Data.HashMap.LazyData.HashMap.Strict
  • Data.ByteString.LazyData.ByteString.Strict
  • Data.Text.LazyData.Text

这些实现的优势和劣势是什么?在选择特定实现时要遵循哪些规则?

4

2 回答 2

27
  • Data.XYMap.LazyData.XYMap.Strict

for XYin {"", "Int", "Hash"}:该*.Strict变体在将映射到的值放入映射之前强制将其评估为 WHNF。

这样做的最大优势是更可预测的空间和时间行为,因为构建巨大的 thunk 要困难得多,尤其是对于表单 ( ConstructorN UnboxedValueTypeN) 的类型,这是不可能的。

缺点 - 我记得在讨论严格或惰性变体是否应该成为默认变体时提出了一些例子,但我不记得有什么特别的事情。

啊,刚刚想起一个用例:可以和变体打结Lazy,当然不可能用Strict版本!所以如果你做这样的事情:Lazy.

Strict默认使用这些版本。在我需要打结或遇到另一个我认为Lazy变体优越的用例之前,我不知道什么时候会使用它们。

  • Data.(ByteString/Text).LazyData.(ByteString/Text).Strict

严格版本使用一个单一的存储块来存储有效负载,这意味着您可以快速随机访问,不仅可以顺序访问,还可以从末尾向后或来回跳转。

惰性版本基本上是严格块的头部严格列表,它们的优势在于它们的顺序消耗通常可以在恒定的小内存中完成,如果您需要顺序处理大文件,那就太好了。

对于小(ish)数据,绝对使用Strict变体,对于大数据,Lazy如果数据被顺序处理(或多或少),则使用变体。

于 2013-04-30T11:08:20.520 回答
23

这些实现的优势和劣势是什么?在选择特定实现时要遵循哪些规则?

类型的严格或懒惰导致特定操作或使用模式的不同复杂性。

没有硬性或快速的规则 - 相反,您可能希望将它们视为完全不同的数据类型。

如果你坚持一些准则:

  • 大于内存的数据的惰性结构
  • 用于不经常使用的数据或使用大型结构的一小部分时的惰性结构

接着:

  • 如果您进行大量更新,则严格的结构
  • 小型原子数据的严格结构
于 2013-04-30T10:58:59.097 回答