Libellés

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

1 commentaire: