Mesurer son temps de build Maven

This post is also available in: en

Des outils pour mesurer en détail le temps de build de chaque exécution d’un build Maven.

Par défaut Maven ne mesure que le temps par module et total du build sans donner de temps intermédiaire.
Il existe heuresement des solutions pour obtenir les temps d’éxécutions de chaque étape de son build.

maven-profiler

Un outil que j’ai écris à l’époque car je n’en avais pas trouvé. Je m’en sers pour trouver quels étapes d’un build optimiser pour réduire son temps d’exécution.

Il génère un rapport (HTML ou JSON) archivé dans le dossier .profiler au sein du projet.

maven-profiler

Pour l’installer il suffit de suivre les instructions disponibles sur github.

Le rapport est généré quand on lance un build avec la propriété système profile :

mvn install -Dprofile

Par défaut le rapport HTML est utilisé, pour avoir le modèle JSON :

mvn install -Dprofile -DprofileFormat=JSON

Exemple de rapport :

{
    "name": "maven-profiler",
    "goals": "clean install",
    "date": "2015/01/17 15:28:49",
    "parameters": "{profile=true, profileFormat=JSON}",
    "projects": [{
        "project": "maven-profiler",
        "time": "6.793 s",
        "mojos": [{
            "mojo": "org.apache.maven.plugins:maven-surefire-plugin:2.18:test {execution: default-test}",
            "time": "2.512 s"
        }, {
            "mojo": "org.apache.maven.plugins:maven-shade-plugin:2.3:shade {execution: default}",
            "time": "1.458 s"
        }, {
            "mojo": "org.codehaus.gmavenplus:gmavenplus-plugin:1.2:testCompile {execution: default}",
            "time": "818.3 ms"
        }, {
            "mojo": "org.apache.maven.plugins:maven-compiler-plugin:3.2:compile {execution: default-compile}",
            "time": "538.7 ms"
        }, {
            "mojo": "org.apache.maven.plugins:maven-source-plugin:2.4:jar-no-fork {execution: attach-sources}",
            "time": "248.5 ms"
        }, {
            "mojo": "org.apache.maven.plugins:maven-jar-plugin:2.5:jar {execution: default-jar}",
            "time": "238.2 ms"
        }, {
            "mojo": "org.apache.maven.plugins:maven-resources-plugin:2.7:resources {execution: default-resources}",
            "time": "171.7 ms"
            }, {
            "mojo": "org.codehaus.plexus:plexus-component-metadata:1.6:generate-metadata {execution: default}",
            "time": "170.5 ms"
        }, {
            "mojo": "org.apache.maven.plugins:maven-enforcer-plugin:1.2:enforce {execution: enforce-maven}",
            "time": "126.0 ms"
        }, {
            "mojo": "org.apache.maven.plugins:maven-clean-plugin:2.6.1:clean {execution: default-clean}",
            "time": "76.11 ms"
        }, {
            "mojo": "org.apache.maven.plugins:maven-install-plugin:2.5.2:install {execution: default-install}",
            "time": "53.95 ms"
        }, {
            "mojo": "org.apache.maven.plugins:maven-compiler-plugin:3.2:testCompile {execution: default-testCompile}",
            "time": "2.850 ms"
        }, {
            "mojo": "org.apache.maven.plugins:maven-resources-plugin:2.7:testResources {execution: default-testResources}",
            "time": "2.518 ms"
        }]
    }]
}

maven-timeline

Ce plugin présente les temps de construction de chaque phase au sein d’un build sous la forme d’un timeline. Initialement développé par David Gageot, il en existe un fork maintenu par l’équipe de takari.

Pour l’utiliser il fait ajouter une extension dans le fichier pom.xml :

<extension>
    <groupId>io.takari.maven</groupId>
    <artifactId>maven-timeline</artifactId>
    <version>1.6</version>
</extension>

Deux rapports sont générés, un en HTML et un en JSON.

maven-timeline

{
  "start": "2015-02-01T19:18:18.738Z",
  "end": "2015-02-01T19:18:21.770Z",
  "dateTimeFormat": "iso8601",
  "events": [
    {
      "start": "2015-02-01T19:18:20.940Z",
      "end": "2015-02-01T19:18:21.095Z",
      "duration": 2380,
      "description": "com.github.jcgay.maven.color:maven-color-logback:package:jar:default-jar (2380 ms)",
      "trackNum": 1,
      "color": "blue",
      "durationEvent": true
    },
    {
      "start": "2015-02-01T19:18:19.136Z",
      "end": "2015-02-01T19:18:19.545Z",
      "duration": 830,
      "description": "com.github.jcgay.maven.color:maven-color-core:compile:compile:default-compile (830 ms)",
      "trackNum": 2,
      "color": "blue",
      "durationEvent": true
    },
    {
      "start": "2015-02-01T19:18:19.562Z",
      "end": "2015-02-01T19:18:19.564Z",
      "duration": 849,
      "description": "com.github.jcgay.maven.color:maven-color-agent:test-compile:testCompile:default-testCompile (849 ms)",
      "trackNum": 3,
      "color": "blue",
      "durationEvent": true
    },
    {
      "start": "2015-02-01T19:18:19.677Z",
      "end": "2015-02-01T19:18:19.818Z",
      "duration": 1103,
      "description": "com.github.jcgay.maven.color:maven-color-agent:package:jar:default-jar (1103 ms)",
      "trackNum": 3,
      "color": "blue",
      "durationEvent": true
    },

    ...

    {
      "start": "2015-02-01T19:18:20.801Z",
      "end": "2015-02-01T19:18:21.549Z",
      "duration": 2834,
      "description": "com.github.jcgay.maven.color:maven-color-log4j2:package:single:make-assembly (2834 ms)",
      "trackNum": 3,
      "color": "blue",
      "durationEvent": true
    }
  ]
}

tesla-profiler

Un autre profiler qui affiche les temps de build dans la console.

Le rapport est généré quand on lance un build avec la propriété système maven.profile :

mvn install -Dmaven.profile

Un exemple de résultat :

com.github.jcgay.maven:maven-profiler:2.2-SNAPSHOT

  clean 81ms
    org.apache.maven.plugins:maven-clean-plugin:2.6.1 (default-clean) 80ms

  validate 145ms
    org.apache.maven.plugins:maven-enforcer-plugin:1.2 (enforce-maven) 145ms

  process-resources 198ms
    org.apache.maven.plugins:maven-resources-plugin:2.7 (default-resources) 198ms

  compile 588ms
    org.apache.maven.plugins:maven-compiler-plugin:3.2 (default-compile) 588ms

  process-classes 209ms
    org.codehaus.plexus:plexus-component-metadata:1.6 (default) 209ms

  process-test-resources 3ms
    org.apache.maven.plugins:maven-resources-plugin:2.7 (default-testResources) 3ms

  test-compile 1s 2ms
    org.apache.maven.plugins:maven-compiler-plugin:3.2 (default-testCompile) 3ms
    org.codehaus.gmavenplus:gmavenplus-plugin:1.2 (default) 998ms

  test 2s 670ms
    org.apache.maven.plugins:maven-surefire-plugin:2.18 (default-test) 2s 669ms

  package 2s 778ms
    org.apache.maven.plugins:maven-jar-plugin:2.5 (default-jar) 250ms
    org.apache.maven.plugins:maven-source-plugin:2.4 (attach-sources) 270ms
    org.apache.maven.plugins:maven-shade-plugin:2.3 (default) 2s 258ms

Bon profiling !

comments powered by Disqus