有一个可变序列或总是删除并创建一个新的不可变序列?

时间:2014-04-28 01:56:24

标签: performance scala immutability

我有一个IndexedSeq,我会读取一些东西,然后更新它并循环。

哪个更有效:

  • 有一个可变的IndexedSeq并更新它并从中读取
  • 每次我想要更新时,删除它并构造一个新的不可变的IndexedSeq

因此,Scala默认为不可变(第二种方法)。是否每3秒钟不得不一次又一次地删除和分配一百万次?

1 个答案:

答案 0 :(得分:3)

鉴于你如何提出这个问题,我强烈怀疑你已经知道答案(在某些情况下)。

然而,哪个更危险?

  • 通过各种不同的方法访问一个可变的IndexedSeq
  • 如果该方法需要更改,则使每个方法创建一个新的内部一致的IndexedSeq

关于不变性的好处在于它很容易推理,而不是它很快。也就是说,各种树结构可以让你回到O(log n)区域进行你可能担心的操作O(n);有时甚至可以通过巧妙地选择数据结构来实现O(1)。

特别是,Scala的Vector是默认的IndexedSeq,它有updated方法只能O(log n)工作,基于32的对数。它肯定远不及更新阵列那么快;根据细节,它甚至可能慢100倍。但是大多数当你实际上并不需要快100倍的东西时,你需要一些没有破坏的东西。

诀窍在于了解您的要求并在适当的地方使用适当的语言结构。