有一个具有惰性和严格实现的数据结构列表:
Data.Map.Lazy
和Data.Map.Strict
Data.IntMap.Lazy
和Data.IntMap.Strict
Data.HashMap.Lazy
和Data.HashMap.Strict
Data.ByteString.Lazy
和Data.ByteString.Strict
Data.Text.Lazy
和Data.Text
这些实现的优势和劣势是什么?在选择特定实现时要遵循哪些规则?
有一个具有惰性和严格实现的数据结构列表:
Data.Map.Lazy
和Data.Map.Strict
Data.IntMap.Lazy
和Data.IntMap.Strict
Data.HashMap.Lazy
和Data.HashMap.Strict
Data.ByteString.Lazy
和Data.ByteString.Strict
Data.Text.Lazy
和Data.Text
这些实现的优势和劣势是什么?在选择特定实现时要遵循哪些规则?
Data.XYMap.Lazy
和Data.XYMap.Strict
for XY
in {"", "Int", "Hash"}
:该*.Strict
变体在将映射到的值放入映射之前强制将其评估为 WHNF。
这样做的最大优势是更可预测的空间和时间行为,因为构建巨大的 thunk 要困难得多,尤其是对于表单 ( ConstructorN UnboxedValueTypeN
) 的类型,这是不可能的。
缺点 - 我记得在讨论严格或惰性变体是否应该成为默认变体时提出了一些例子,但我不记得有什么特别的事情。
啊,刚刚想起一个用例:可以和变体打结Lazy
,当然不可能用Strict
版本!所以如果你做这样的事情:Lazy
.
我Strict
默认使用这些版本。在我需要打结或遇到另一个我认为Lazy
变体优越的用例之前,我不知道什么时候会使用它们。
Data.(ByteString/Text).Lazy
和Data.(ByteString/Text).Strict
严格版本使用一个单一的存储块来存储有效负载,这意味着您可以快速随机访问,不仅可以顺序访问,还可以从末尾向后或来回跳转。
惰性版本基本上是严格块的头部严格列表,它们的优势在于它们的顺序消耗通常可以在恒定的小内存中完成,如果您需要顺序处理大文件,那就太好了。
对于小(ish)数据,绝对使用Strict
变体,对于大数据,Lazy
如果数据被顺序处理(或多或少),则使用变体。
这些实现的优势和劣势是什么?在选择特定实现时要遵循哪些规则?
类型的严格或懒惰导致特定操作或使用模式的不同复杂性。
没有硬性或快速的规则 - 相反,您可能希望将它们视为完全不同的数据类型。
如果你坚持一些准则:
接着: