14

我正在使用一个可变的Buffer,需要找出它有多少元素。

size和方法都是length定义的,继承自不同的特征。

是否有任何实际的性能差异,或者它们可以被视为确切的同义词?

4

4 回答 4

16

它们是同义词,主要是 Java 决定使用sizefor 集合和lengthfor Arrayand的结果String。一个总是根据另一个来定义,您可以通过查看源代码轻松查看哪个是哪个,scaladoc 上提供了链接。只需找到定义特征,打开源代码,然后搜索def sizeor def length

于 2013-02-06T17:01:38.113 回答
5

在这种情况下,它们可以被视为同义词。您可能需要注意其他一些情况,例如Array- 虽然长度和大小将始终返回相同的结果,但在 Scala 2.10 之前的版本中,调用可能会有装箱开销size(由数组周围的 Scala 包装器提供) , 而length 由底层 Java Array 提供。

在 Scala 2.10 中,通过使用提供方法的值类已经消除了这种开销size,因此您可以随意使用您喜欢的任何方法。

于 2013-02-06T16:42:09.577 回答
4

从 Scala-2.11 开始,这些方法可能具有不同的性能。例如,考虑以下代码:

val bigArray = Array.fill(1000000)(0)
val beginTime = System.nanoTime()
var i = 0
while (i < 2000000000) {
  i += 1
  bigArray.length
}
val endTime = System.nanoTime()
println(endTime - beginTime)
sys.exit(-1)

在我的 amd64 计算机上运行它会产生大约 2423834 纳秒的时间(不时变化)。

现在,如果我将length方法更改为size,它将变为大约 70764719 纳秒时间。

慢了 20 倍以上。

为什么会这样?没挖过,不知道 但是在某些情况下length,它们的size表现截然不同。

于 2017-02-16T14:11:06.057 回答
3

它们是同义词,就像状态的 scaladoc Buffer.size

这个缓冲区的大小,相当于长度。

scaladoc forBuffer.length也很明确:

缓冲区的长度。注意: xs.length 和 xs.size 产生相同的结果。

简单的建议:在提问之前参考 scaladoc。

更新:刚刚看到您的编辑添加了对性能的提及。作为 Daniel C. Sobral 的助手,一个通常总是在另一个方面执行,因此它们具有相同的性能。

于 2013-02-06T16:31:20.253 回答