我正在使用一个可变的Buffer
,需要找出它有多少元素。
size
和方法都是length
定义的,继承自不同的特征。
是否有任何实际的性能差异,或者它们可以被视为确切的同义词?
我正在使用一个可变的Buffer
,需要找出它有多少元素。
size
和方法都是length
定义的,继承自不同的特征。
是否有任何实际的性能差异,或者它们可以被视为确切的同义词?
它们是同义词,主要是 Java 决定使用size
for 集合和length
for Array
and的结果String
。一个总是根据另一个来定义,您可以通过查看源代码轻松查看哪个是哪个,scaladoc 上提供了链接。只需找到定义特征,打开源代码,然后搜索def size
or def length
。
在这种情况下,它们可以被视为同义词。您可能需要注意其他一些情况,例如Array
- 虽然长度和大小将始终返回相同的结果,但在 Scala 2.10 之前的版本中,调用可能会有装箱开销size
(由数组周围的 Scala 包装器提供) , 而length
由底层 Java Array 提供。
在 Scala 2.10 中,通过使用提供方法的值类已经消除了这种开销size
,因此您可以随意使用您喜欢的任何方法。
从 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
表现截然不同。
它们是同义词,就像状态的 scaladoc Buffer.size
:
这个缓冲区的大小,相当于长度。
scaladoc forBuffer.length
也很明确:
缓冲区的长度。注意: xs.length 和 xs.size 产生相同的结果。
简单的建议:在提问之前参考 scaladoc。
更新:刚刚看到您的编辑添加了对性能的提及。作为 Daniel C. Sobral 的助手,一个通常总是在另一个方面执行,因此它们具有相同的性能。