La indexación en matrices en un ciclo while es tan rápida en Scala como en Java. (Scala de bucle "for" no es la construcción de bajo nivel que Java es, por lo que no va a funcionar de la manera deseada.)
Así, si en Java que ver
for (int i=0 ; i < array.length ; i++) sum += array(i)
en Scala que debiera escriba
var i=0
while (i < array.length) {
sum += array(i)
i += 1
}
y si realiza los puntos de referencia adecuadamente, no encontrará diferencia en la velocidad.
Si tiene iteradores de todos modos, entonces Scala es tan rápido como Java en la mayoría de las cosas. Por ejemplo, si usted tiene un ArrayList de dobles y en Java que añadirlos usando
for (double d : arraylist) { sum += d }
después en Scala podrás aproximadamente tan rápido - si se utiliza una estructura de datos equivalente como ArrayBuffer - con
arraybuffer.foreach(sum += _)
y no demasiado lejos de la marca con cualquiera de
sum = (0 /: arraybuffer)(_ + _)
sum = arraybuffer.sum // 2.8 only
Tenga en cuenta, sin embargo, que hay una penalización a la mezcla de construcciones de alto nivel y de bajo nivel. Por ejemplo, si decide comenzar con una matriz pero luego utiliza "foreach" en ella en lugar de indexarla, Scala debe envolverla en una colección (ArrayOps
en 2.8) para que funcione, y con frecuencia tendrá que marcar los primitivos también.
De todos modos, para las pruebas de referencia, estas dos funciones son tus amigos:
def time[F](f: => F) = {
val t0 = System.nanoTime
val ans = f
printf("Elapsed: %.3f\n",1e-9*(System.nanoTime-t0))
ans
}
def lots[F](n: Int, f: => F): F = if (n <= 1) f else { f; lots(n-1,f) }
Por ejemplo:
val a = Array.tabulate(1000000)(_.toDouble)
val ab = new collection.mutable.ArrayBuffer[Double] ++ a
def adSum(ad: Array[Double]) = {
var sum = 0.0
var i = 0
while (i<ad.length) { sum += ad(i); i += 1 }
sum
}
// Mixed array + high-level; convenient, not so fast
scala> lots(3, time(lots(100,(0.0 /: a)(_ + _))))
Elapsed: 2.434
Elapsed: 2.085
Elapsed: 2.081
res4: Double = 4.999995E11
// High-level container and operations, somewhat better
scala> lots(3, time(lots(100,(0.0 /: ab)(_ + _))))
Elapsed: 1.694
Elapsed: 1.679
Elapsed: 1.635
res5: Double = 4.999995E11
// High-level collection with simpler operation
scala> lots(3, time(lots(100,{var s=0.0;ab.foreach(s += _);s})))
Elapsed: 1.171
Elapsed: 1.166
Elapsed: 1.162
res7: Double = 4.999995E11
// All low level operations with primitives, no boxing, fast!
scala> lots(3, time(lots(100,adSum(a))))
Elapsed: 0.185
Elapsed: 0.183
Elapsed: 0.186
res6: Double = 4.999995E11
Muéstranos el código de la evaluación comparativa. – Jesper