Scala缓冲区:大小或长度?

时间:2013-02-06 16:22:45

标签: scala scala-collections

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

定义sizelength两种方法,继承自不同的特征。

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

4 个答案:

答案 0 :(得分:15)

它们是同义词,主要是由于Java决定对集合size而对lengthArray String。一个将始终根据另一个进行定义,您可以通过查看源代码,scaladoc上提供的链接,轻松查看哪个是哪个。只需找到定义特征,打开源代码,然后搜索def sizedef 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慢

为什么会这样?我没有挖掘它,我不知道。但场景lengthsize表现完全不同。