Optimize interleave method

Benchmarking shows this is 20x faster for vectors.
pull/2701/head
Isaac Levy 2017-03-27 17:26:02 -04:00
parent f2301f334d
commit 828e727900
2 changed files with 10 additions and 16 deletions

View File

@ -1,21 +1,15 @@
package lila.common
import scala.annotation.tailrec
object Sequence {
def interleave[A](a: Seq[A], b: Seq[A]): Vector[A] = {
val iterA = a.iterator
val iterB = b.iterator
val builder = Vector.newBuilder[A]
while (iterA.hasNext && iterB.hasNext) {
builder += iterA.next += iterB.next
}
builder ++= iterA ++= iterB
@tailrec
def interleave[A](base: Vector[A], a: List[A], b: List[A]): Vector[A] = a match {
case elt :: aTail => interleave(base :+ elt, b, aTail)
case _ => base ++ b
}
def interleave[A](a: Vector[A], b: Vector[A]): Vector[A] = interleave(Vector.empty, a, b)
@tailrec
def interleave[A](acc: Vector[A], a: Vector[A], b: Vector[A]): Vector[A] = (a, b) match {
case (a1 +: as, b1 +: bs) => interleave(acc :+ a1 :+ b1, as, bs)
case (Vector(), y) => acc ++ y
case (x, Vector()) => acc ++ x
builder.result
}
}

View File

@ -134,7 +134,7 @@ case class Game(
for {
a <- moveTimes(startColor)
b <- moveTimes(!startColor)
} yield Sequence.interleave(Vector.empty, a, b)
} yield Sequence.interleave(a, b)
}
def bothClockStates = clockHistory.map(_ bothClockStates startColor)