在 Scala 3 中,序列上的 `isEmpty` 比 `length == 0` 更快?

问题描述 投票:0回答:1

在 Scala 3 中我定义了一个序列,例如:

val seq = List(1,8,9)

操作

seq.isEmpty
seq.length == 0
快吗?

想一想,`isEmpty应该更快(因为它只需要检查第一个“下一个”元素是否不存在),但是在Scala 3中真的是这样实现的吗?

scala performance collections sequence scala-3
1个回答
0
投票

Scala 3 仍然使用 Scala 2.13 标准库。

List
上,2个操作定义如下:

// https://github.com/scala/scala/blob/951cc9b1cc3dccd36762de4d6176bf8fd76a842f/src/library/scala/collection/immutable/List.scala#L142

override final def isEmpty: Boolean = this eq Nil
// https://github.com/scala/scala/blob/951cc9b1cc3dccd36762de4d6176bf8fd76a842f/src/library/scala/collection/immutable/List.scala#L361

override final def length: Int = {
  var these = this
  var len = 0
  while (!these.isEmpty) {
    len += 1
    these = these.tail
  }
  len
}

因此预计

isEmpty
length
快得多。

请注意,一般来说,如果您想比较两个实现,您应该始终运行一些基准测试(例如 JMH)。由于包括 JVM 优化在内的多种原因,理论成本和实际花费的时间可能会有显着差异。

© www.soinside.com 2019 - 2024. All rights reserved.