Performance 拥有可变序列还是总是删除并创建新的不可变序列?
我有一个IndexedSeq,我将从中读取一些内容,然后更新它并循环 哪一个更有效:Performance 拥有可变序列还是总是删除并创建新的不可变序列?,performance,scala,immutability,Performance,Scala,Immutability,我有一个IndexedSeq,我将从中读取一些内容,然后更新它并循环 哪一个更有效: 拥有一个可变IndexedSeq,并对其进行更新和读取 每次我想更新它时,都要删除它并构造一个新的不可变IndexedSeq 因此,Scala默认为不可变(第二种方法)。每3秒钟就要一次又一次地删除和分配一百万次,这不是很低效吗?考虑到你提出这个问题的方式,我强烈怀疑你已经知道答案了(在某些情况下) 然而,哪个更危险 通过各种不同的方法访问一个可变IndexedSeq 如果每个方法需要更改,请使其创建一个
- 拥有一个可变IndexedSeq,并对其进行更新和读取
- 每次我想更新它时,都要删除它并构造一个新的不可变IndexedSeq
因此,Scala默认为不可变(第二种方法)。每3秒钟就要一次又一次地删除和分配一百万次,这不是很低效吗?考虑到你提出这个问题的方式,我强烈怀疑你已经知道答案了(在某些情况下) 然而,哪个更危险
- 通过各种不同的方法访问一个可变IndexedSeq
- 如果每个方法需要更改,请使其创建一个新的内部一致的IndexedSeq
向量
是默认的IndexedSeq
,它有一个更新的
方法,该方法只执行O(logn)
操作,以32为对数为基础。它当然远没有更新数组那么快;根据细节,它甚至可能慢100倍。但大多数时候,你并不需要比现在快100倍的东西,你需要的是不坏的东西
诀窍在于了解您的需求,并在适当的位置使用适当的语言结构。hmm。。。在我的例子中,我看不到拥有不可变结构的任何好处,所以我认为我应该使用可变结构(显然它在内部是一个ArrayBuffer)。我来自C#背景,所以我仍在想如何利用Scala的功能。我觉得我正在弯曲它以适应我的老方法。正如俗话所说的“如果不一定是正确的,我可以写运行得像你喜欢的一样快的代码”(我想是乔恩·本特利写的)。如果您不相信关于不可变结构的更简单的推理会使您的程序更有可能是正确的,那么不,您将看不到不可变性的任何价值。另一句话(出自Tony Hoare)“构建软件设计有两种方法:一种方法是使其简单到明显没有缺陷,另一种方法是使其复杂到没有明显缺陷。”不变性有助于前者。