Scalameter
Es una libreria para hacer benchmarking
/*
* This Scala source file was generated by the Gradle 'init' task. */package taller
import org.scalameter._
import common._
object App {
def main(args: Array[String]): Unit = {
println(greeting())
prueba()
}
@scala.annotation.tailrec
def sumarArray(arr:Array[Int], i:Int=0, acc:Long=0L):Long = {
if (i == arr.length) acc
else sumarArray(arr,i+1, acc + arr(i))
}
def medir(n:Int, arr:Array[Int], i:Int = 1): Unit = {
if (i <= n){
val t = measure {
val res: Long = sumarArray(arr)
//println(res)
}
println(t)
medir(n, arr, i + 1)
}
}
def prueba():Unit = {
val arr: Array[Int] = (1 to Math.pow(10, 8).toInt).toArray
//Medir
medir(10,arr)
}
def greeting(): String = "Hello, world!"
}
La salida nos da asi
59.766833 ms
54.464319 ms
25.126186 ms
26.241147 ms
25.830602 ms
26.647554 ms
26.470388 ms
24.866799 ms
26.190944 ms
26.411821 ms
Observe que la dos primeras están desfasadas, por el calentamiento de la JVM (Carga GC, Del gestor de hilos, etc)
Para evitar este problema usamos el Warmer (esperar hasta estado estable)
def medir(n:Int, arr:Array[Int], i:Int = 1): Unit = {
if (i <= n){
val t = withWarmer(new Warmer.Default) measure {
val res: Long = sumarArray(arr)
//println(res)
}
println(t)
medir(n, arr, i + 1)
}
}
Nos da ahora el siguiente resultado
24.930053 ms
26.195989 ms
27.134956 ms
26.143745 ms
25.544506 ms
25.314685 ms
25.92297 ms
26.050548 ms
25.203183 ms
25.641507 ms
Como vemos ya no tenemos los primeros tiempos alterados