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