2012-10-23 2 views
34

작업이 gradle 빌드 스크립트를 가져간 시간에 대한 실행 시간을 추적하는 가장 우아한 방법은 무엇입니까? 최적의 경우 작업 이름 깨끗한 솔루션은 TaskExecutionListener가와 gradle.taskGraph.addTaskExecutionListener에 등록 (난 당신이 그 부분을 처리 할 수있는 확신)를 구현하는 것입니다gradle 스크립트에서 작업 당 실행 시간 추적?

:buildSrc:testClasses (0.518 secs) 
:fooBar (28.652 secs) 
+7

'--profile' 매개 변수로 gradle을 실행하면'build/reports/profile'에 보고서가 생성되어 작업 실행 시간이됩니다 ... 충분합니까? –

+0

좋은 보고서이지만 모든 빌드 관련 정보를 수집하는 데 추가 단계가 필요합니다. Jenkins gradle 작업을 분석하는 사람은 실행 시간을 직접 인라인으로 볼 수 있습니다. Thx 어쨌든! – ngeek

답변

14

에 직접적으로 동일하거나 다음 줄 시간을 기록합니다.

+0

고마워,이게 딱 맞는 소리 같아. 내가 누락 된 유일한 문제는 모든 작업에 리스너를 등록하는 방법 뿐이다. – ngeek

+0

한 번만 단일 수신기를 등록하면됩니다. –

+3

이것은 내가 끝낸 스 니펫입니다. https://gist.github.com/3939407 – ngeek

70

다른 대답을 자세히 설명하면 다음과 같습니다. 빌드의 끝 부분에 보고서 타이밍뿐만 아니라 동일한 작업을 수행하려고 했으므로 느린 단계가 분명합니다 (적절한 당사자는 작지만 건강한 비트를 느낍니다). 부끄러움을 때 그들은 빌드 천천히!). 아래 코드 등

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() 
+2

Thx, 이것은 훌륭한 대답입니다. 슈퍼 편리한 상자. – Snicolas

+1

이것은 플러그인이나 스크립트를 오염시키지 않고 빌드 스크립트에 쉽게 추가 할 수있는 어떤 방법이 될 수 있습니까? 아니면 더 깨끗한 방식으로이 타이밍을 수행하는 다른 방법이 있습니까? 고맙습니다! – ag0rex

+1

앱의 설치 시간 (기기/에뮬레이터까지)을 포함하여 총 시간을 어떻게 표시 할 수 있습니까? –

14

나는 이것이 오래된 질문이지만, 나는 태스크 타이밍을 수행하는 멋진 플러그인을 발견했다. 그것은 @ jlevy 대답과 같지만 더 많은 옵션을 사용할 수 있습니다 : https://github.com/passy/build-time-tracker-plugin

이 플러그인은 빌드 시간을 지속적으로 기록하고 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' 
     } 
    } 
} 
+1

새로운 DSL에 대해서도 작동합니다! –

7

이 사용되지 않습니다 공개적으로 액세스 Gradle을 Clock 클래스의 사용을 제거하도록 수정되었습니다 jlevy's answer above의 변형이다. 아래의 코드와 같은

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()