Libellés

Affichage des articles dont le libellé est benchmark. Afficher tous les articles
Affichage des articles dont le libellé est benchmark. Afficher tous les articles

mercredi 13 juillet 2011

Benchmark d'une classe, d'une méthode, ... en Groovy

Pour mesurer le temps d'exécution d'une méthode en Java, on utilise de l'AOP ou des println à la main.

EN Groovy, je viens de découvrir un projet qui s'appelle GBench qui permet de mesurer des temps d’exécutions.

On peut mesurer les temps d’exécutions de toutes les méthodes d'une classe :


@Grab(group='com.googlecode.gbench', module='gbench', version='11.07.05')
import gbench.*

@Benchmark()
class Klass {
def foo() {
Thread.sleep(10)
}
def bar() {
Thread.sleep(5)
}
}

def k = new Klass()

println "call foo"
k.foo()

println "call bar"
k.bar()

Klass void (): 14999053 ns
call foo
Klass java.lang.Object foo(): 14887245 ns
call bar
Klass java.lang.Object bar(): 5129355 ns



Seulement d'une méthode (et regarder comment spécifier le format d'affichage) :

@Grab(group='com.googlecode.gbench', module='gbench', version='11.07.05')
import gbench.*

class Klass {

@Benchmark({println("${method} of ${klass}: ${(time/1000000) as long} ms")})
def foo() {
Thread.sleep(10)
}
def bar() {
Thread.sleep(5)
}
}

def k = new Klass()

println "call foo"
k.foo()

println "call bar"
k.bar()


call foo
java.lang.Object foo() of Klass: 14 ms
call bar



Ou faire des comparaisons sur 1000 exécutions.
Dans cet exemple je compare le Parseur JSON de Groovy 1.8 avec celui de Jackson :


@Grab(group='com.googlecode.gbench', module='gbench', version='11.07.05')
@Grab(group='org.codehaus.jackson', module='jackson-mapper-asl', version='1.8.3')

import gbench.*
import groovy.json.JsonSlurper
import org.codehaus.jackson.map.ObjectMapper;

def slurper = new JsonSlurper()
def mapper = new ObjectMapper();

def jsonString = '{"name": "Romain", "age": 25}'
class Personn{ String name; int age }

def bench = new BenchmarkBuilder()
bench.run(times: 1000){
with 'Groovy JSON', {
Personn p = slurper.parseText(jsonString)
assert p.name == "Romain"
assert p.age == 25
}
with 'Jackson', {
Personn p = mapper.readValue(jsonString, Personn.class)
assert p.name == "Romain"
assert p.age == 25
}
}

println bench


time
Groovy JSON 179218175
Jackson 66699800