2012-10-23 12 views
34

निष्पादन के समय को ट्रैक करने का सबसे शानदार तरीका क्या है कि एक कार्य धीरे-धीरे निर्माण स्क्रिप्ट में कितना समय लगता है? एक इष्टतम मामले में समय लॉग ऑन सीधे ही या कार्य नामग्रेडल स्क्रिप्ट में प्रति कार्य निष्पादन समय ट्रैक करें?

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

यदि आप '--profile' पैरामीटर के साथ ग्रेडल चलाते हैं, तो यह कार्य निष्पादन समय के साथ 'बिल्ड/रिपोर्ट/प्रोफाइल' में एक रिपोर्ट उत्पन्न करता है ... क्या यह काफी अच्छा है? –

+0

यह एक अच्छी रिपोर्ट है, लेकिन सभी बिल्ड संबंधित जानकारी एकत्र करने में एक अतिरिक्त कदम की आवश्यकता है, बेहतर रूप से हमारे जेनकिंस ग्रेडल नौकरियों का विश्लेषण करने वाले व्यक्ति निष्पादन समय को सीधे इनलाइन देख सकते हैं। वैसे भी Thx! – ngeek

उत्तर

14

साफ समाधान लागू करने के लिए एक TaskExecutionListener और gradle.taskGraph.addTaskExecutionListener से पंजीकृत करें (मैं तुम्हें वह हिस्सा संभाल कर सकते हैं यकीन है) है के बगल में लाइन।

+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

पास्कल हार्टिग द्वारा यह प्लगइन लगातार आपके निर्माण के समय लॉग करता है और सीएसवी और बार चार्ट सारांश प्रदान करता है। डेवलपर इसे समय के साथ आपके निर्माण समय की निगरानी के लिए अनुशंसा करता है, बनाम --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

के ऊपर '// noinspection GroovyAssignabilityCheck' भी नई डीएसएल सामग्री के लिए काम करता है! –

7

यह jlevy's 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() 
संबंधित मुद्दे