2009-08-06 16 views
21

मैं इसे समय देने के लिए System.nanoTime() जोड़ी में लगातार लपेटता कोड। कुछ ऐसा:जावा प्रदर्शन समय पुस्तकालय

long start = System.nanoTime();  
methodToBeTimed(); 
long elapsedTime = System.nanoTime() - start; 

कोई अच्छी टाइमिंग लाइब्रेरी है जो इस समस्या से मदद करती है? होमग्राउंड कोड भी स्वीकार किया जाएगा।

नायब

एक प्रोफाइलर एक हल उपलब्ध नहीं है, क्योंकि मैं अपने इकाई परीक्षण में कुछ समय की कमी लागू करना चाहते हैं, तो मैं प्रोग्राम के रूप में समय तरीकों करना चाहते हैं।

+0

मुझे समझ में नहीं आता कि "समस्या" क्या है जिसे आप हल करने की कोशिश कर रहे हैं। आपके पास शीर्ष पर एक पंक्ति है, और आपको समय बीतने के लिए नीचे एक और पंक्ति है। और आपके पास इसे रखने के लिए एक चर है। आप इसे कक्षा में लपेट सकते हैं, या स्टॉपवॉच क्लास का उपयोग कर सकते हैं, लेकिन आप वास्तव में किसी भी तरह से कोड की जटिलता को कम नहीं करेंगे: आपको अभी भी शीर्ष पर एक पंक्ति और नीचे की एक पंक्ति की आवश्यकता होगी। क्या आप इस तरह के समय की बड़ी संख्या रिकॉर्डिंग और ट्रैकिंग में मदद चाहते हैं? – AgilePro

उत्तर

11

मैंने इसका उपयोग नहीं किया है, लेकिन मैं हाल ही में perf4j पर आया हूं।

+0

@ मार्क प्रदर्शित करें: इसके बारे में कभी नहीं सुना। बहुत बहुत धन्यवाद! – dfa

+0

आप एकीकृत servlet के साथ perf4j के साथ ग्राफ भी खींच सकते हैं। यह काफी अच्छा है। – unludo

+0

perf4j github में स्थानांतरित किया गया https://github.com/perf4j/perf4j – Sebastien

8

नहीं अपने प्रश्न के लिए एक सीधा जवाब है, लेकिन मैं यह भी अक्सर मेरे कोड समय पर इस टिप का उपयोग कर रहा है और बस निम्नलिखित सरल ग्रहण लिखा था -> चारों ओर टेम्पलेट के साथ:

long startTime = System.currentTimeMillis(); 
${line_selection}${cursor} 
long totalTime = System.currentTimeMillis() - startTime; 
System.out.println("Total time = " + totalTime); 
System.out.println(); 
+0

दुर्भाग्य से मैं नेटबीन्स उपयोगकर्ता हूं - :) – dfa

1

की कोशिश की JPerf?

+0

उपयोग देखने के लिए Google कैश का उपयोग करें, वैकल्पिक रूप से xjperf को लिंक देखें: http://code.google.com/p/xjperf/ – techzen

+0

यह आईपीरफ़ के लिए एक अग्रभाग प्रतीत होता है, जो है "अधिकतम टीसीपी और यूडीपी बैंडविड्थ प्रदर्शन को मापने के लिए एक आधुनिक विकल्प"। यह सही है? – dfa

1

आप इस समस्या के साथ किस तरह की मदद की तलाश कर रहे हैं? आपके पास मूल बातें हैं। आप नैनोसेकंड में विलुप्त समय प्राप्त करते हैं, अंतर्निहित ओएस/हार्डवेयर के किसी भी संकल्प के लिए सटीक है।

भी ... और मुझे पता है कि आपने कोई प्रोफाइलर नहीं कहा है ... लेकिन मुझे YourKit के साथ उत्कृष्ट अनुभव मिला है। यह एक एपीआई प्रदान करता है जिसका उपयोग आप बाहर से प्रोफाइलिंग को नियंत्रित करने के लिए कर सकते हैं। आपकी सटीक समस्या क्या है, इस पर निर्भर करते हुए, यह देखने के लायक हो सकता है।

6

कॉमन्स-लैंग से StopWatch है, यह आपको टाइमर को विभाजित करने की अनुमति देता है।

+0

इसे देखने के लिए अच्छा है, लेकिन यह केवल सिस्टम को हटाता है। नैनोटाइम/System.currentTimeMillis – dfa

+0

को डिफ़ॉल्ट संस्करण की तुलना में उपयोग करना हमेशा आसान होता है;) – IAdapter

+0

लिंकक टूटा हुआ ... – Pacerier

8

जुनीट 4 को अंतर्निहित समय-संयम कार्यक्षमता मिली।

@Test (टाइमआउट = एक्स)

चाल करना चाहिए। एक्स को मिलीसेकंड की अधिकतम संख्या है जिसे विधि को चलाने की अनुमति है।

+0

मेरे लिए एक विजेता की तरह लगता है। –

+0

हां, यह एक बहुत ही बेसिलर कार्यान्वयन है, अनिवार्य रूप से मैं @ टेस्ट (टाइमआउट = एक्स, दोहराना = एन) के लिए देख रहा हूं, फिर औसत – dfa

3

यदि आप वसंत का उपयोग कर रहे हैं तो आपके पास इस प्रस्ताव के लिए आपके क्लासपाथ में StopWatch नामक अच्छी कक्षा है।

1

JETM ऐसा करने के लिए एक अच्छी लाइब्रेरी है। यह मिनट, अधिकतम और औसत भी प्रदान कर सकता है, साथ ही सूचनात्मक ग्राफ उत्पन्न कर सकता है।

0

हस्तनिर्मित ...

import static java.lang.System.nanoTime; 

/** 
* For testing/debug purposes. 
* 
* <pre> 
* private Stopwatch stopwatch = new Stopwatch(); 
* ... 
* public void method1() { 
*  stopwatch.reset(); 
*  for (...) { 
*   ... 
*   stopwatch.start(); 
*   operation1(); 
*   stopwatch.stop(); 
*   ... 
*  } 
*  System.out.println("operation 1 max timing is " + stopwatch.getMaxLapTime()); 
* } 
* ... 
* public void method2() { 
*  stopwatch.reset(); 
*  for (...) { 
*   ... 
*   stopwatch.start(); 
*   operation2(); 
*   stopwatch.stop(); 
*   ... 
*  } 
*  System.out.println("operation 2 max timing is " + stopwatch.getMaxLapTime()); 
* } 
* </pre> 
* 
* @author Mykhaylo Adamovych 
*/ 
public class Stopwatch { 
    protected long totalTime; 
    protected long maxLapTime; 
    protected long minLapTime = Long.MAX_VALUE; 
    protected long lapsCount; 
    protected long lastThreshold; 

    /** 
    * Human readable time in seconds 
    * 
    * @param nanoTime 
    * @return time in seconds 
    */ 
    public static final String toSeconds(long nanoTime) { 
     return String.format("%.9f", nanoTime/1000000000.0); 
    } 

    public long getAverageLapTime() { 
     if (lapsCount == 0) 
      return 0; 
     return totalTime/lapsCount; 
    } 

    public long getMaxLapTime() { 
     return maxLapTime; 
    } 

    public long getMinLapTime() { 
     return minLapTime; 
    } 

    public long getTotalTime() { 
     return totalTime; 
    } 

    /** 
    * Returns last lap time, process statistic. 
    */ 
    public long lapTime() { 
     return processLapTime(); 
    } 

    private long processLapTime() { 
     if (lastThreshold == 0) 
      throw new IllegalStateException("Stopwatch is stopped."); 
     final long now = nanoTime(); 
     final long lapTime = now - lastThreshold; 
     lapsCount++; 
     totalTime += lapTime; 
     if (lapTime > maxLapTime) 
      maxLapTime = lapTime; 
     if (lapTime < minLapTime) 
      minLapTime = lapTime; 
     lastThreshold = nanoTime(); 
     return lapTime; 
    } 

    /** 
    * Resets statistic and starts. 
    */ 
    public void reset() { 
     totalTime = 0; 
     maxLapTime = 0; 
     minLapTime = Long.MAX_VALUE; 
     lapsCount = 0; 
     start(); 
    } 

    /** 
    * Starts time watching. 
    */ 
    public void start() { 
     lastThreshold = nanoTime(); 
    } 

    /** 
    * Suspends time watching, returns last lap time. 
    */ 
    public long stop() { 
     final long lapTime = processLapTime(); 
     lastThreshold = 0; 
     return lapTime; 
    } 
} 
+1

मुझे नहीं लगता कि 'मिनीलैपटाइम' के लिए आपका कार्यान्वयन काम करेगा, क्योंकि यह सबसे कम संभव मूल्य के साथ शुरू किया गया है: 0. इसे संभवतः प्रारंभ किया जाना चाहिए (और रीसेट करें) 'Long.MAX_VALUE'। – martin

0

बाजार पर कुछ नया JMH है। यह ओपनजेड परियोजना की छतरी के नीचे बनाया गया है।

0

मैंने अभी Java Simon (पूर्व में on Google Code) का उपयोग करना शुरू कर दिया है, और यह शानदार लगता है! कुछ निर्भरताओं के साथ स्टॉपवॉच और काउंटर का एक साधारण सेट।

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