Ответ 1
Самое чистое решение - реализовать TaskExecutionListener (я уверен, что вы можете обработать эту часть) и зарегистрировать его с помощью gradle.taskGraph.addTaskExecutionListener
.
Каков самый элегантный способ отслеживания времени выполнения в том, как долго выполнялась задача в gradle build script? В оптимальном случае запишите время непосредственно той же или следующей строки имени задачи
:buildSrc:testClasses (0.518 secs)
:fooBar (28.652 secs)
Самое чистое решение - реализовать TaskExecutionListener (я уверен, что вы можете обработать эту часть) и зарегистрировать его с помощью gradle.taskGraph.addTaskExecutionListener
.
Чтобы подробно рассказать о другом ответе: мы хотели сделать то же самое, а также тайминги отчета в конце так что медленные шаги очевидны (и соответствующие стороны чувствуют небольшой, но здоровый бит, когда они замедляют сборку!).
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()
Я знаю, что это старый вопрос, но я нашел классный плагин, который выполняет задачу. Это похоже на ответ @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'
}
}
}
Это вариант 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()