在 Scala 3 中我定义了一个序列,例如:
val seq = List(1,8,9)
操作
seq.isEmpty
比seq.length == 0
快吗?
想一想,`isEmpty应该更快(因为它只需要检查第一个“下一个”元素是否不存在),但是在Scala 3中真的是这样实现的吗?
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 优化在内的多种原因,理论成本和实际花费的时间可能会有显着差异。