要迭代一個迭代器,我們可以調用它的foreach
或使用while循環。的foreach
實現是:scala迭代器#foreach性能問題
def foreach[U](f: A => U) { while (hasNext) f(next()) }
所以我覺得應該foreach
快while(iterator.hasNext)
,但做了一些測試後,結果讓我感到吃驚非常。
我的測試代碼:
def getSize2[T](i: Iterator[T]) = {
var count = 0
val f = (a: T) => count += 1
while(i.hasNext) {
f(i.next)
}
count
}
def getSize3[T](i: Iterator[T]) = {
var count = 0
val f = (a: T) => count += 1
i.foreach(f)
count
}
這是非常奇怪的是getSize2
比getSize3
快3倍!
任何人都知道那裏發生了什麼?
編輯: 貼我的測試程序
def main(args: Array[String]) {
val data = 0 to 100000000
val start2 = System.nanoTime
(0 to 100).foreach(_ => getSize2(data.iterator))
println("get size, while loop, using function: " + (System.nanoTime - start2)/1000000)
val start3 = System.nanoTime
(0 to 100).foreach(_ => getSize3(data.iterator))
println("get size, foreach: " + (System.nanoTime - start3)/1000000)
}
我的操作系統:Ubuntu的12.04,斯卡拉版本:2.10.3
你可以寫你如何衡量執行速度?我的意思是你執行的實際代碼和命令行。另外scala版本和你正在運行的操作系統。 – ymonad
看看字節碼,你會看到foreach正在做更多的調用。 – monkjack
這很有趣,因爲我看到了相反的結果。 while(iter.hasNext){count + = 1; iter.next()}需要6倍的時間。 – Snnappie