2010-04-03 14 views
64

क्षमा करें अगर यह एक गूंगा प्रश्न की तरह लगता है लेकिन आप जावा प्रोग्राम के निष्पादन को कैसे समय देते हैं? मुझे यकीन नहीं है कि मुझे ऐसा करने के लिए किस वर्ग का उपयोग करना चाहिए।जावा प्रोग्राम निष्पादन की गति कैसे करें

मैं थोड़े की तरह कुछ के लिए देख रहा हूँ:

//Some timer starts here 
for (int i = 0; i < length; i++) { 
    // Do something 
} 
//End timer here 

System.out.println("Total execution time: " + totalExecutionTime); 

धन्यवाद

उत्तर

106
final long startTime = System.currentTimeMillis(); 
for (int i = 0; i < length; i++) { 
    // Do something 
} 
final long endTime = System.currentTimeMillis(); 

System.out.println("Total execution time: " + (endTime - startTime)); 

आशा है कि इससे मदद मिलेगी।

+1

यह वास्तव में नैनो समय होना चाहिए वास्तव में – Eugene

+4

नैनोटाइम नहीं होना चाहिए। रुहू का जवाब देखें। – fabspro

+3

क्या कोई विशेष कारण है कि आपने यहां "अंतिम" उपयोग किया है? यदि आपने उस कीवर्ड को छोड़ दिया तो क्या अलग होगा? – dijxtra

7

आप System#nanoTime() का उपयोग कर सकते। इसे निष्पादन से पहले और बाद में प्राप्त करें और गणित करें। इसे System#currentTimeMillis() से ऊपर पसंद किया गया है क्योंकि इसमें बेहतर परिशुद्धता है। इस्तेमाल किए गए हार्डवेयर और प्लेटफ़ॉर्म के आधार पर, आप अन्यथा समय बीतने में गलत अंतर प्राप्त कर सकते हैं। यहां विंडोज़ पर Core2Duo के साथ, लगभग 0 और ~ 15ms के बीच वास्तव में कुछ भी गणना नहीं की जा सकती है।

एक और उन्नत उपकरण profiler है।

+0

विंडोज़ पर टाइमर डिफ़ॉल्ट रूप से विशेष रूप से अच्छा रिज़ॉल्यूशन नहीं है। वहाँ * एक उच्च प्रदर्शन टाइमर भी है, लेकिन सी और जावा से भी इसका उपयोग करना बहुत कठिन है (AFAIK) जेएनआई थंक के बिना उस कम स्तर के हैकर तक पहुंच प्रदान करता है। प्रोफाइलर लिंक के लिए –

+0

+1। –

+1

'नैनोटाइम() 'में एक समस्या है (कम से कम विंडोज़ पर); टाइमस्टैम्प प्रोसेसर कोर के लिए विशिष्ट है। मेरे पास एक ऐसा प्रोग्राम था जिसने नकारात्मक निष्पादन समय प्राप्त किया क्योंकि इसे एक कोर पर "स्टार्ट" टाइमस्टैंप मिला, और "कोर" टाइमस्टैम्प को किसी अन्य कोर पर मिला। – gustafc

6

आप मौजूदा सिस्टम का समय मिलता है, मिलीसेकेंड में:

for (int i = 0; i < length; i++) { 
    // Do something 
} 

तब आप देख कितना समय ले लिया:

final long startTime = System.currentTimeMillis(); 

तो फिर तुम तुम क्या करने जा रहे हैं कि क्या करना

final long elapsedTimeMillis = System.currentTimeMillis() - startTime; 
+0

बलुस का जवाब भी सही है; यह आवश्यक टाइमर रिज़ॉल्यूशन पर निर्भर करता है, और आपको समय की आवश्यकता क्यों है। –

1

उपयोग लंबे प्रारंभ समय के लिए startTime=System.currentTimeMillis(), पाश

के शीर्ष पर पाश के अंत बाहर long endTime= System.currentTimeMillis(); डाल दिया। रनटाइम को मिलीसेकंड में प्राप्त करने के लिए आपको मानों को घटाना होगा।

आप नैनोसेकंड में समय चाहते हैं, बाहर की जाँच System.nanoTime()

0
public class someClass 
{ 
    public static void main(String[] args) // your app start point 
    { 
     long start = java.util.Calendar.getInstance().getTimeInMillis(); 

     ... your stuff ... 

     long end = java.util.Calendar.getInstance().getTimeInMillis(); 
     System.out.println("it took this long to complete this stuff: " + (end - start) + "ms"); 
    } 
} 
29

ध्यान रखें कि कुछ मुद्दों जहां System#nanoTime() नहीं मज़बूती से बीता हुआ समय रिकॉर्ड करने के लिए मल्टी कोर CPU के पर इस्तेमाल किया जा सकता हैं कि ... प्रत्येक कोर रखता है इसका अपना टीएससी (Time Stamp Counter): इस काउंटर का उपयोग नैनो समय प्राप्त करने के लिए किया जाता है (वास्तव में यह सीपीयू बूट होने के बाद से टिकों की संख्या है)।

इसलिए, जब तक ओएस कोर को सिंक में रखने के लिए कुछ टीएससी समय warping नहीं करता है, तो अगर प्रारंभिक समय पढ़ने के बाद एक कोर पर एक धागा निर्धारित हो जाता है, तो एक अलग कोर पर स्विच किया जाता है, सापेक्ष समय sporadically कर सकते हैं पीछे और आगे कूदने के लिए दिखाई देते हैं।

मैंने इसे कुछ समय पहले एएमडी/सोलारिस पर देखा जहां दो समय बिंदुओं के बीच गुजरने वाले समय कभी-कभी नकारात्मक मूल्य या अप्रत्याशित रूप से बड़ी सकारात्मक संख्या के रूप में वापस आ रहे थे। एएमडी पावर नाउ को मजबूर करने के लिए एक सोलारिस कर्नेल पैच और एक BIOS सेटिंग थी! बंद, जो इसे हल करने के लिए दिखाई दिया।

वर्चुअलबॉक्स वातावरण में जावा System#nanoTime() का उपयोग करते समय भी (AFAIK) एक बहुत दूर अनदेखा बग है; हमारे लिए विचित्र इंटरमीटेंट थ्रेडिंग समस्याओं के सभी प्रकार के कारण java.util.concurrency पैकेज नैनो समय पर निर्भर करता है।

यह भी देखें:

Is System.nanoTime() completely useless? http://vbox.innotek.de/pipermail/vbox-trac/2010-January/135631.html

+3

+1। ऑटो जनरेटर कोड को इंगित करने के लिए – Jason

3

सरल सामान के लिए, System.currentTimeMillis() काम कर सकते हैं।

यह वास्तव में इतना आम है कि मेरे आईडीई सेटअप है ताकि प्रवेश करते समय "t0" यह मुझे निम्न पंक्ति उत्पन्न करता है:

final long t0 = System.currentTimeMillis() 

लेकिन और अधिक जटिल चीजों के लिए, तो आप शायद सांख्यिकीय समय माप का उपयोग करना चाहेंगे , यहाँ की तरह (थोड़ा नीचे स्क्रॉल करें और समय माप को देखो व्यक्त मानक विचलन आदि सहित):

http://perf4j.codehaus.org/devguide.html

+0

+1। मैं हर समय एक समान कथन का उपयोग करता हूं, और कोड टेम्पलेट्स डालने के बारे में नहीं जानता था। बस ग्रहण के साथ ऐसा करने के लिए पता चला, और यह निश्चित रूप से मदद करेगा! – Jason

+0

सभी कोडहॉस सेवाओं को समाप्त कर दिया गया है। आपका लिंक अब टूट गया है। – naXa

0

तुम भी Perf4J कोशिश कर सकते हैं। जो भी आप खोज रहे हैं, उसका एक साफ तरीका है, और एक निश्चित समय अवधि के दौरान औसत, न्यूनतम, अधिकतम, मानक विचलन और प्रति सेकंड लेनदेन जैसे समेकित प्रदर्शन आंकड़ों में सहायता करता है। http://perf4j.codehaus.org/devguide.html से एक उद्धरण:

StopWatch stopWatch = new LoggingStopWatch(); 

try { 
    // the code block being timed - this is just a dummy example 
    long sleepTime = (long)(Math.random() * 1000L); 
    Thread.sleep(sleepTime); 
    if (sleepTime > 500L) { 
     throw new Exception("Throwing exception"); 
    } 

    stopWatch.stop("codeBlock2.success", "Sleep time was < 500 ms"); 
} catch (Exception e) { 
    stopWatch.stop("codeBlock2.failure", "Exception was: " + e); 
} 

आउटपुट:

INFO: start[1230493236109] time[447] tag[codeBlock2.success] message[Sleep time was < 500 ms] 
INFO: start[1230493236719] time[567] tag[codeBlock2.failure] message[Exception was: java.lang.Exception: Throwing exception] 
INFO: start[1230493237286] time[986] tag[codeBlock2.failure] message[Exception was: java.lang.Exception: Throwing exception] 
INFO: start[1230493238273] time[194] tag[codeBlock2.success] message[Sleep time was < 500 ms] 
INFO: start[1230493238467] time[463] tag[codeBlock2.success] message[Sleep time was < 500 ms] 
INFO: start[1230493238930] time[310] tag[codeBlock2.success] message[Sleep time was < 500 ms] 
INFO: start[1230493239241] time[610] tag[codeBlock2.failure] message[Exception was: java.lang.Exception: Throwing exception] 
INFO: start[1230493239852] time[84] tag[codeBlock2.success] message[Sleep time was < 500 ms] 
INFO: start[1230493239937] time[30] tag[codeBlock2.success] message[Sleep time was < 500 ms] 
INFO: start[1230493239968] time[852] tag[codeBlock2.failure] message[Exception was: java.lang.Exception: Throwing exception] 
0

System.currentTimeMillis का उपयोग करना() ऐसा करने का उचित तरीका है।

time java App 

जो आप कोड और समय अपने ऐप नहीं संशोधित करने के लिए अनुमति देता है: लेकिन, यदि आप कमांड लाइन का उपयोग करें, और आप लगभग और जल्दी से पूरे कार्यक्रम समय करना चाहते हैं, के बारे में सोचते हैं।

+0

यह इस बात पर निर्भर करता है कि आप कोड कैसे चलाते हैं। यदि यह सर्वर चलाने वाला कोड का एक टुकड़ा है, तो आप स्टार्टअप समय को शामिल करने जा रहे हैं जो गलत है। –

2

का उपयोग AOP/AspectJ और jcabi-aspects से @Loggable एनोटेशन आप कर सकते हैं यह आसान है और कॉम्पैक्ट:

@Loggable(Loggable.DEBUG) 
public String getSomeResult() { 
    // return some value 
} 

इस विधि के लिए हर कॉल DEBUG लॉगिंग स्तर के साथ SLF4J लॉगिंग सुविधा के लिए भेजा जाएगा। और प्रत्येक लॉग संदेश में निष्पादन समय शामिल होगा।

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