56

gradleビルドスクリプトでタスクにかかった時間の実行時間を追跡する最もエレガントな方法は何ですか? 最適なケースでは、タスク名の同じ行または次の行に直接時間を記録します。

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

9 に答える 9

97

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()
于 2013-10-17T22:47:15.043 に答える
26

これは、廃止された一般にアクセス可能な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()
于 2017-03-14T18:02:46.443 に答える
22

最もクリーンな解決策は、TaskExecutionListenerを実装し(その部分を処理できると確信しています)、それを に登録することgradle.taskGraph.addTaskExecutionListenerです。

于 2012-10-23T13:54:04.733 に答える
22

これは古い質問ですが、タスクのタイミングを行うクールなプラグインを見つけました。@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'
        }
    }
}
于 2015-10-06T21:09:00.713 に答える
1

フラグは--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秒 うまくいきませんでした

Gradle ビルド スキャン

この--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秒
于 2021-08-09T21:58:55.173 に答える