2009-12-12 9 views
45

जावा VisualVM में, क्या "स्वयं समय" के बजाय कुल विधि समय प्रदर्शित करने का कोई तरीका है? (उत्तरार्द्ध विशेष रूप से उपयोगी नहीं है, क्योंकि यह आपको कुछ भी नहीं बताता है कि वास्तव में कितने समय के तरीके चलते हैं।)जावा में कुल विधि समय VisualVM

यदि नहीं, तो क्या कोई स्टैंडअलोन मुफ्त जावा प्रोफाइलर है जो कुल विधि समय की गणना करता है?

उत्तर

47

"स्नैपशॉट" दृश्य में ट्रेस डेटा को देखते हुए आप कुल और स्वयं के समय को देखने की अनुमति देता है।

परिणामों की तालिका के बारे में दिखाई देने वाले "स्नैपशॉट" बटन दबाएं। यह एक नया टैब बनाएगा जिसमें "कॉल ट्री" व्यू होगा जो स्वयं बनाम कुल समय को तोड़ देगा। "संयुक्त" दृश्य भी यह जानकारी प्रदान करता है, लेकिन स्क्रीन स्पेस को "हॉट स्पॉट" दृश्य के साथ विभाजित करता है जो मानक प्रोफाइलिंग दृश्य के समान होता है।

स्नैपशॉट्स को मानक "प्रोफाइलर" या "नमूना" डेटा से बनाया जा सकता है। हालांकि, "प्रोफाइलर" स्नैपशॉट केवल एप्लिकेशन बंद होने से पहले ही बनाया जा सकता है, जबकि "नमूना" किसी भी समय बनाया जा सकता है।

(उपर्युक्त जानकारी VisualVM 1.3 पर आधारित है।1)

+4

यह उत्तर सबसे तेज़ और सहायक है। मैंने इसका एक संक्षिप्त स्क्रीनकास्ट बनाया: http://rhnh.net/2011/08/03/profiling-clojure –

+0

जेवियर, स्क्रीनकास्ट के लिए धन्यवाद। यह स्पष्ट कर दिया। –

-3

आप

और

long endTime = System.currentTimeMillis(); 

और अंत में परिणाम

long result = endTime - startTime; //Note, part might be backwards, I don't 
            //Remember 
+0

अंत - शुरू करें ... अन्यथा आप कुछ के साथ हवाएं: 0 - 100 = -100 100 - 0 = 100 की 100%। – TofuBeer

+0

इसके लिए धन्यवाद, मैंने सोचा कि मुझे यह पीछे की ओर हो सकता है ... – Brendan

+8

सिस्टम का उपयोग करें .nanoTime(), currentTimeMillis() ओएस इंटरप्ट दरों के कारण त्रुटि प्रवण है: http://blogs.sun.com/dholmes/entry/inside_the_hotspot_vm_clocks –

1

प्राप्त करने के लिए शुरुआत में एक

long startTime = System.currentTimeMillis(); 

इस्तेमाल कर सकते हैं इसमें कुल प्राप्त करने के लिए एक आसान तरीका है एक राउ का समय दीवार घड़ी निष्पादन समय (मिलीसेकंड के बजाए) के प्रतिशत के रूप में टिन करें। जब आप इसकी प्रतीक्षा कर रहे हों तो स्टैकशॉट का एक समूह प्राप्त करने के लिए बस ctrl-break का उपयोग करें। दिनचर्या युक्त उनमें से अंश वह समय है जो इसे लेता है। सटीकता इस बात पर निर्भर करती है कि आप कितने शॉट लेते हैं। यदि आप केवल यह कह रहे हैं कि समस्याएं कहां हैं, तो आपको सटीक समय माप की आवश्यकता नहीं है। Here's a short explanation of how it works.

7

बस प्रोफाइलिंग परिणामों का एक स्नैपशॉट लें। आपको दीवार घड़ी के साथ-साथ स्वयं का समय मिलेगा।

-1

JavaAssist स्रोत को छूए बिना आपके जावा बाइट कोड में हेरफेर करने के लिए एक क्लास लाइब्रेरी है। चलिए एक विधि निष्पादित करने के लिए समय मापने का एक उदाहरण लें।

public class Subject { 
    /** 
    * Timetaken for start & end of the method 
    * 
    * @throws InterruptedException 
    */ 
    public void method2() throws InterruptedException { 
     // Some business logic :) 
     Thread.sleep(2000); 
    } 
} 

subject.method2() को क्रियान्वित करने के लिए ले जाया समय को मापने के लिए, आप के रूप में दिखाया गया है कोड के शुरू और विधि के अंत जोड़कर Subject.methods() बढ़ाने सकता है।

public class JavaAssist { 
    public static void main(String[] args) { 
     timeTaken(); 
    } 

    public static void timeTaken() { 
     try { 
      ClassPool p = ClassPool.getDefault(); 
      CtClass cc = p.get("Subject"); 
      CtMethod meth2 = cc.getDeclaredMethod("method2"); 
      meth2.insertBefore("System.out.println(\" Start : \"+new java.util.Date());"); 
      meth2.insertAfter("System.out.println(\" End : \"+new java.util.Date());"); 
      // cc.writeFile("."); 
      Class c = cc.toClass(); 
      Subject s = (Subject) c.newInstance(); 
      s.method2(); 
      cc.detach(); 
     } catch (Exception e) { 
      // suppressed 
     } 
    } 
} 

आउटपुट: शुरू करें: बुध मई 26 17:24:18 EDT 2010 अंत: बुध मई 26 17:24:20 EDT 2010

संदर्भ http://www.csg.is.titech.ac.jp/~chiba/javassist/tutorial/tutorial.html#read

http://www.csg.is.titech.ac.jp/~chiba/javassist/html/

उत्पत्ति पोस्ट से: http://www.senthilb.com/2010/05/javaassist-byte-code-enhancement.html

0

मुझे लगता है कि आप यह जानना चाहते हैं कि प्रत्येक विधि निष्पादन कितना समय लेता है। आप प्रदर्शन की निगरानी के लिए जेईटीएम का उपयोग करना चाहते हैं। यह आपको प्रवेश समय, निकास समय और प्रत्येक विधि के लिए एक समय अंतर प्रदान करेगा। आप पाएंगे कि कौन सी विधि कितनी समय ले रही है।

आप स्प्रिंग उपयोग कर रहे हैं तो यह JETM http://jetm.void.fm/howto/spring_2_x_integration.html

0

एकीकृत करने के लिए आप विधि तुम्हारे लिए समय पर अमल की निगरानी के लिए jprofiler या कुछ javaagent उपकरणों का उपयोग कर सकते हैं आसान हो जाता है, GitHub पर कुछ खुले स्रोत उपकरण है की तरह simpleAPM।

संबंधित मुद्दे