我正在使用一个可变的Buffer
,需要找出它有多少元素。
定义size
和length
两种方法,继承自不同的特征。
是否有任何实际的性能差异,或者它们是否可以被视为完全同义词?
答案 0 :(得分:15)
它们是同义词,主要是由于Java决定对集合size
而对length
和Array
String
。一个将始终根据另一个进行定义,您可以通过查看源代码,scaladoc上提供的链接,轻松查看哪个是哪个。只需找到定义特征,打开源代码,然后搜索def size
或def length
。
答案 1 :(得分:5)
在这种情况下,它们可以被视为同义词。您可能需要注意其他一些情况,例如Array
- 虽然长度和大小将始终返回相同的结果,但在Scala 2.10之前的版本中,可能会有一个用于调用size
的装箱开销(其中由数组周围的Scala包装器提供,而length
由底层Java数组提供。
在Scala 2.10中,通过使用提供size
方法的值类来消除此开销,因此您可以随意使用您喜欢的任何方法。
答案 2 :(得分:2)
它们是同义词,因为Buffer.size
状态的scaladoc:
此缓冲区的大小,相当于长度。
Buffer.length
的scaladoc也是明确的:
缓冲区的长度。注意:xs.length和xs.size会产生相同的结果。
简单建议:在提问之前参考scaladoc。
更新:刚看到您的编辑添加提及性能。正如丹尼尔·索布拉尔(Daniel C. Sobral)所做的那样,一个人通常总是按照另一个人的方式实施,所以他们具有相同的表现。
答案 3 :(得分:2)
从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纳秒。
这比 20x慢。
为什么会这样?我没有挖掘它,我不知道。但有场景length
和size
表现完全不同。