Подтвердить что ты не робот

Отслеживать время выполнения для каждой задачи в gradle script?

Каков самый элегантный способ отслеживания времени выполнения в том, как долго выполнялась задача в gradle build script? В оптимальном случае запишите время непосредственно той же или следующей строки имени задачи

:buildSrc:testClasses (0.518 secs)
:fooBar (28.652 secs)
4b9b3361

Ответ 1

Самое чистое решение - реализовать TaskExecutionListener (я уверен, что вы можете обработать эту часть) и зарегистрировать его с помощью gradle.taskGraph.addTaskExecutionListener.

Ответ 2

Чтобы подробно рассказать о другом ответе: мы хотели сделать то же самое, а также тайминги отчета в конце так что медленные шаги очевидны (и соответствующие стороны чувствуют небольшой, но здоровый бит, когда они замедляют сборку!).

BUILD SUCCESSFUL

Total time: 1 mins 37.973 secs
Task timings:
    579ms  :myproject-foo:clean
  15184ms  :myproject-bar:clean
   2839ms  :myproject-bar:compileJava
  10157ms  :myproject-bar:jar
    456ms  :myproject-foo:compileJava
    391ms  :myproject-foo:libs
    101ms  :myproject-foo:jar
    316ms  :myproject-bar:compileTestJava
    364ms  :myproject-foo:compileTestJava
  53353ms  :myproject-foo:test
   2146ms  :myproject-bar:test
   8348ms  :www/node:npmInstall
    687ms  :www/node:npmTest

Что-то вроде кода ниже можно сбросить на верхний уровень build.gradle, чтобы сообщать о таймингах во время выполнения или после завершения.

// Log timings per task.
class TimingsListener implements TaskExecutionListener, BuildListener {
    private Clock clock
    private timings = []

    @Override
    void beforeExecute(Task task) {
        clock = new org.gradle.util.Clock()
    }

    @Override
    void afterExecute(Task task, TaskState taskState) {
        def ms = clock.timeInMs
        timings.add([ms, task.path])
        task.project.logger.warn "${task.path} took ${ms}ms"
    }

    @Override
    void buildFinished(BuildResult result) {
        println "Task timings:"
        for (timing in timings) {
            if (timing[0] >= 50) {
                printf "%7sms  %s\n", timing
            }
        }
    }

    @Override
    void buildStarted(Gradle gradle) {}

    @Override
    void projectsEvaluated(Gradle gradle) {}

    @Override
    void projectsLoaded(Gradle gradle) {}

    @Override
    void settingsEvaluated(Settings settings) {}
}

gradle.addListener new TimingsListener()

Ответ 3

Я знаю, что это старый вопрос, но я нашел классный плагин, который выполняет задачу. Это похоже на ответ @jlevy, но с некоторыми дополнительными вариантами: https://github.com/passy/build-time-tracker-plugin

Этот плагин Pascal Hartig непрерывно регистрирует время сборки и предоставляет сводки CSV и гистограммы. Разработчик рекомендует отслеживать время сборки с течением времени по сравнению с --profile, которое дает моментальный снимок для текущей сборки.

Вот как я его сейчас использую:

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath "net.rdrei.android.buildtimetracker:gradle-plugin:0.7.+"
    }
}

apply plugin: "build-time-tracker"

buildtimetracker {
    reporters {
        summary {
            ordered false
            threshold 50
            barstyle 'unicode'
        }
    }
}

Ответ 4

Это вариант jlevy answer above, который был изменен, чтобы удалить использование общедоступного класса gradle Clock, который устарел.

BUILD SUCCESSFUL

Total time: 1 mins 37.973 secs
Task timings:
    579ms  :myproject-foo:clean
  15184ms  :myproject-bar:clean
   2839ms  :myproject-bar:compileJava
  10157ms  :myproject-bar:jar
    456ms  :myproject-foo:compileJava
    391ms  :myproject-foo:libs
    101ms  :myproject-foo:jar
    316ms  :myproject-bar:compileTestJava
    364ms  :myproject-foo:compileTestJava
  53353ms  :myproject-foo:test
   2146ms  :myproject-bar:test
   8348ms  :www/node:npmInstall
    687ms  :www/node:npmTest

Что-то вроде кода ниже может быть сброшено на ваш верхний уровень build.gradle, чтобы сообщать о таймингах во время выполнения или после завершения.

import java.util.concurrent.TimeUnit
// Log timings per task.
class TimingsListener implements TaskExecutionListener, BuildListener {
    private long startTime
    private timings = []

    @Override
    void beforeExecute(Task task) {
        startTime = System.nanoTime()
    }

    @Override
    void afterExecute(Task task, TaskState taskState) {
        def ms = TimeUnit.MILLISECONDS.convert(System.nanoTime() - startTime, TimeUnit.NANOSECONDS);
        timings.add([ms, task.path])
        task.project.logger.warn "${task.path} took ${ms}ms"
    }

    @Override
    void buildFinished(BuildResult result) {
        println "Task timings:"
        for (timing in timings) {
            if (timing[0] >= 50) {
                printf "%7sms  %s\n", timing
            }
        }
    }

    @Override
    void buildStarted(Gradle gradle) {}

    @Override
    void projectsEvaluated(Gradle gradle) {}

    @Override
    void projectsLoaded(Gradle gradle) {}

    @Override
    void settingsEvaluated(Settings settings) {}
}

gradle.addListener new TimingsListener()