【问题标题】:Best performant immutable Seq for measuring length用于测量长度的最佳性能不可变 Seq
【发布时间】:2012-07-23 21:59:35
【问题描述】:

无论出于何种原因,Performance Characteristics Doc 中对此没有任何概念,所以我挖掘了源代码并发现 ListQueue 似乎有 O(n),因为他们遍历所有成员。 Vector 似乎有O(1),因为它只是从另一个Int 中减去一个。

现在,无论集合是面向追加还是面向前置都无关紧要,但其中任何一个都必须是O(1),并且不需要高性能apply

Vector 是正确的选择吗?你会建议哪个?

【问题讨论】:

  • 在极少数情况下ListVector 更好。默认为Vector,除非你有充分的理由不这样做。
  • @LuigiPlinge 您是否建议使用Vector 作为默认的Seq 实现?这种观点至少对我来说似乎不寻常,因为链表遍布函数式编程世界并且是默认的集合类型。此外,Vector 作为一个更复杂的结构,在用于headtailprepend 操作时必然会表现得更差。它还必须占用更多内存。您能否参考有关此的任何研究/讨论/阅读材料?
  • 也很有趣:this question 表明VectorList 具有更好的内存占用。 在其中一个邮件列表上讨论过 Vector 作为 scala.Seq 的默认类型,但我再也找不到了。
  • @LuigiPlinge 谢谢。第一个链接上的答案有点证明List 在您知道自己在做什么时会更好(即头部、尾部和前置),Vector 虽然在这些操作上稍慢一点,但对于大多数其他,因此更适合一般类型的集合。

标签: scala immutability scala-collections


【解决方案1】:

Vector 是正确的选择吗?

是的。另一种方法是围绕 List 创建自己的不可变包装器,将其大小添加为常量,但如果您想允许所有标准收集操作,这将是很多工作。坚持Vector

【讨论】:

  • 谢谢!对于 cmets 中的链接也是如此
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-06
  • 1970-01-01
  • 2019-12-19
  • 2023-03-24
  • 2011-02-25
相关资源
最近更新 更多