gradleビルドスクリプトでタスクにかかった時間の実行時間を追跡する最もエレガントな方法は何ですか? 最適なケースでは、タスク名の同じ行または次の行に直接時間を記録します。
:buildSrc:testClasses (0.518 secs)
:fooBar (28.652 secs)
gradleビルドスクリプトでタスクにかかった時間の実行時間を追跡する最もエレガントな方法は何ですか? 最適なケースでは、タスク名の同じ行または次の行に直接時間を記録します。
:buildSrc:testClasses (0.518 secs)
:fooBar (28.652 secs)
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
以下のコードのようなものを最上位にドロップして、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()
これは、廃止された一般にアクセス可能なgradleクラスの使用を削除するために変更されたjlevyの回答の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 projectsEvaluated(Gradle gradle) {}
@Override
void projectsLoaded(Gradle gradle) {}
@Override
void settingsEvaluated(Settings settings) {}
}
gradle.addListener new TimingsListener()
最もクリーンな解決策は、TaskExecutionListenerを実装し(その部分を処理できると確信しています)、それを に登録することgradle.taskGraph.addTaskExecutionListener
です。
これは古い質問ですが、タスクのタイミングを行うクールなプラグインを見つけました。@jlevy's answerのようなものですが、さらにいくつかのオプションが利用可能です: 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'
}
}
}
フラグは--profile
、プロファイル レポートを生成します。生成された HTML ファイルには、タスクごとのタイミングを含む [タスクの実行] タブが含まれています。
$ gradle build --profile
BUILD SUCCESSFUL in 21s
6 actionable tasks: 6 executed
See the profiling report at: file:///path/to/gs-spring-boot/complete/build/reports/profile/profile-2021-08-09-16-22-40.html
A fine-grained performance profile is available: use the --scan option.
これは、オンラインのコマンドライン インターフェイス ドキュメントに記載されています。
ディレクトリに高レベルのパフォーマンス レポートを生成し
$buildDir/reports/profile
ます。--scan
が好ましい。
仕事 間隔 結果 : 20.046秒 (合計) :コンパイルJava 9.221秒 :テスト 6.492秒 :compileTestJava 3.161秒 :bootJarMainClassName 0.813秒 :bootJar 0.338秒 :ジャー 0.017秒 :プロセスリソース 0.003秒 ノーソース :クラス 0.001秒 うまくいきませんでした :組み立てる 0秒 うまくいきませんでした :建てる 0秒 うまくいきませんでした :小切手 0秒 うまくいきませんでした :processTestResources 0秒 ノーソース :testClasses 0秒 うまくいきませんでした
この--profile
オプションとそのドキュメントはどちらも、このオプションを使用してビルド スキャン--scan
を生成することを推奨しています。これにより、スキャンが生成され、scans.gradle.comに公開されます。ビルドの詳細を Gradle ビルド スキャン外部サービスに送信するだけでなく、Gradle の利用規約に同意する必要があります。
$ gradle build --scan
BUILD SUCCESSFUL in 0s
7 actionable tasks: 7 executed
Publishing a build scan to scans.gradle.com requires accepting the Gradle Terms of Service defined at https://gradle.com/terms-of-service.
Do you accept these terms? [yes, no] yes
Gradle Terms of Service accepted.
Publishing build scan...
https://gradle.com/s/5u4w3gxeurtd2
4 つのプロジェクトで 61 のタスクを 7 秒で実行し、10 のタスクを回避して 4.231 秒節約
:buildSrc:compileKotlin 3.584秒 :アプリ:テスト 0.745秒 :リスト:テスト 0.742秒 :list:compileJava 0.062秒 :utilities:compileJava 0.054秒 :app:startScripts 0.049秒