scala/scala — pull request #2323 by paulp (2013-03-27 03:02:43+00:00)
Title: Iterator.++ no longer blows the stack.

To my chagrin we still hadn't gotten this one. I took a new
approach which seems like a winner to me. Here's a benchmark:

object Test {
def run(n: Int) = println((1 to n).foldLeft(Iterator.empty: Iterator[Int])((res, _) => res ++ Iterator(1)) sum)
def main(args: Array[String]): Unit = run(args(0).toInt)
}

Runtime before this commit for various n:

500 0.403 real
1000 0.911 real
1500 2.351 real
2000 5.298 real
2500 10.184 real

Runtime after this commit, same n:

500 0.346 real
1000 0.359 real
1500 0.368 real
2000 0.379 real
2500 0.390 real

In the test case I dial it up to 100000.