java 在gradle脚本中跟踪每个任务的执行时间?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/13031538/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Track execution time per task in gradle script?
提问by ngeek
What is the most elegant way to track the execution times on how long a task took in a gradle build script? In an optimal case log the time directly same or next line to the task name
跟踪任务在 gradle 构建脚本中花费多长时间的执行时间的最优雅方法是什么?在最佳情况下,将时间直接记录到任务名称的同一行或下一行
:buildSrc:testClasses (0.518 secs)
:fooBar (28.652 secs)
采纳答案by Peter Niederwieser
The cleanest solution is to implement a TaskExecutionListener(I'm sure you can handle that part) and register it with gradle.taskGraph.addTaskExecutionListener
.
最干净的解决方案是实现一个TaskExecutionListener(我相信你可以处理那部分)并使用gradle.taskGraph.addTaskExecutionListener
.
回答by jlevy
Just to elaborate on Peter Niederwieser's answer: We wanted to do the same thing, as well as a report timings at the end of the build, so slow steps are obvious (and appropriate parties feel a small but healthy bit of shame when they slow down the build!).
只是为了详细说明Peter Niederwieser 的回答:我们想做同样的事情,并在构建结束时报告时间,所以缓慢的步骤是显而易见的(适当的各方在放慢速度时会感到一种小小的但健康的羞耻感构建!)。
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
Something like the code below can be dropped into your top level build.gradle
to report timings during execution, or after completion.
类似下面的代码可以放入您的顶层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()
回答by André Gil
I know this is an old question, but I've found a cool plugin that does task timing. It's like @jlevy's answer, but with some more options available: https://github.com/passy/build-time-tracker-plugin
我知道这是一个老问题,但我找到了一个很酷的插件,可以执行任务计时。这就像@jlevy 的回答,但有更多可用选项:https: //github.com/passy/build-time-tracker-plugin
This plugin by Pascal Hartig continuously logs your build times and provides CSV and bar chart summaries. The developer recommends it for monitoring your build times over time, versus --profile
which gives you a snapshot for the current build.
Pascal Hartig 的这个插件会持续记录您的构建时间并提供 CSV 和条形图摘要。开发人员推荐它随着时间的推移监控您的构建时间,而不是--profile
它为您提供当前构建的快照。
This is how I'm currently using it:
这是我目前使用它的方式:
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'
}
}
}
回答by Jon
This is a variation of jlevy's answerwhich has been modified to remove the usage of the publicly accessible gradle Clock
class, which has been deprecated.
这是jlevy 答案的一个变体,它已被修改以删除Clock
已弃用的可公开访问的 gradle类的使用。
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
Something like the code below can be dropped into your top level build.gradle
to report timings during execution, or after completion.
类似下面的代码可以放入您的顶层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()
回答by ericn
Simple sorting would make @jlevy's solutioneven better.
Also, for a typical production apps, I think the threshold of 50ms is too low.
We usually care about tasks that take more than 1 second.
project/build.gradle
简单的排序将使@jlevy 的解决方案更好。
此外,对于典型的生产应用程序,我认为 50ms 的阈值太低了。
我们通常关心耗时超过 1 秒的任务。
项目/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(new Tuple2<Integer, String>(ms, task.path))
task.project.logger.warn "${task.path} took ${ms}ms"
}
@Override
void buildFinished(BuildResult result) {
println "Task timings:"
def tmp = timings.toSorted(new Comparator<Tuple2<Integer, String>>() {
@Override
int compare(Tuple2<Integer, String> o, Tuple2<Integer, String> t1) {
return o.first - t1.first
}
})
for (timing in tmp) {
if (timing.first >= 1000) {
printf "%ss %s\n", timing.first / 1000, timing.second
}
}
}
@Override
void buildStarted(Gradle gradle) {}
@Override
void projectsEvaluated(Gradle gradle) {}
@Override
void projectsLoaded(Gradle gradle) {}
@Override
void settingsEvaluated(Settings settings) {}
}
gradle.addListener new TimingsListener()
Terminal output:
终端输出:
BUILD SUCCESSFUL in 14m 33s
948 actionable tasks: 419 executed, 476 from cache, 53 up-to-date
Task timings:
1.036s :cbl-config:mergeMyAppDebugResources
1.187s :express:bundleMyAppDebug
1.199s :country:testMyAppDebugUnitTest
1.214s :core-for-test:extractMyAppDebugAnnotations
1.242s :analytics:testMyAppDebugUnitTest
1.308s :express:extractMyAppDebugAnnotations
1.33s :availability:dataBindingExportBuildInfoMyAppDebug
1.357s :app:transformNativeLibsWithStripDebugSymbolForMyAppDebug
1.405s :hermes:generateMyAppDebugBuildConfig
1.56s :availability:testMyAppDebugUnitTest
1.65s :app:javaPreCompileMyAppDebugUnitTest
1.749s :chat:compileMyAppDebugJavaWithJavac
1.858s :cbl-config-for-test:compileMyAppDebugJavaWithJavac
2.027s :cbl-config:compileMyAppDebugJavaWithJavac
2.056s :analytics-for-test:compileMyAppDebugJavaWithJavac
2.447s :crypto:compileMyAppDebugJavaWithJavac
2.45s :crypto:testMyAppDebugUnitTest
2.47s :chat:javaPreCompileMyAppDebugUnitTest
2.639s :crypto-for-test:dataBindingExportBuildInfoMyAppDebug
2.683s :test-utils:compileMyAppDebugJavaWithJavac
3.056s :crypto:lintMyAppDebug
3.227s :app:transformNativeLibsWithMergeJniLibsForMyAppDebug
3.272s :express:testMyAppDebugUnitTest
3.394s :crypto:mergeMyAppDebugResources
3.426s :core:testMyAppDebugUnitTest
4.299s :multicity:testMyAppDebugUnitTest
4.333s :app:packageMyAppDebug
4.584s :availability-for-test:compileMyAppDebugJavaWithJavac
4.672s :app:transformResourcesWithMergeJavaResForMyAppDebug
4.786s :map:lintMyAppDebug
5.309s :country:lintMyAppDebug
5.332s :job:lintMyAppDebug
5.389s :map:testMyAppDebugUnitTest
6.04s :express:lintMyAppDebug
6.584s :hermes:lintMyAppDebug
6.707s :app:transformClassesWithMultidexlistForMyAppDebug
7.052s :multicity:lintMyAppDebug
8.044s :multicity:compileMyAppDebugJavaWithJavac
8.87s :app:transformDexArchiveWithDexMergerForMyAppDebug
9.371s :uikit:testMyAppDebugUnitTest
9.429s :availability:lintMyAppDebug
13.12s :app:compileMyAppDebugUnitTestKotlin
16.276s :hermes:testMyAppDebugUnitTest
16.898s :chat:testMyAppDebugUnitTest
17.174s :job:testMyAppDebugUnitTest
36.008s :grab-junior:testMyAppDebugUnitTest
96.88s :app:compileMyAppDebugJavaWithJavac
125.693s :app:lintMyAppDebug
145.538s :app:transformClassesWithDexBuilderForMyAppDebug
182.752s :app:testMyAppDebugUnitTest