2011-09-19 20 views
6

मैं गणना करना चाहता हूं कि जावा में मेरे फ़ंक्शन को निष्पादित करने में कितना CPU समय लगता है। वर्तमान में मैं नीचे जैसा कर रहा हूं।जावा में CPU निष्पादन समय

long startTime = System.currentTimeMillis(); 
    myfunction(); 
    long endTime = System.currentTimeMillis(); 
    long searchTime = endTime - startTime; 

लेकिन मुझे पता चला कि उसी I/P के लिए मुझे सिस्टम लोड के आधार पर अलग-अलग समय मिलता है।

तो, मेरे फ़ंक्शन को निष्पादित करने के लिए सटीक CPU समय कैसे प्राप्त करें।

उत्तर

6

चूंकि जेवीएम युद्ध करता है तो समय की मात्रा अलग-अलग होगी। दूसरी बार जब आप इसे चलाते हैं तो हमेशा पहले की तुलना में तेज़ होगा। (पहली बार कक्षाओं को लोड करना और स्थैतिक ब्लॉक कॉल करना) 10,000 बार विधि चलाने के बाद यह फिर से तेज हो जाएगा (डिफ़ॉल्ट थ्रेसहोल्ड जिस पर यह देशी मशीन कोड को कोड संकलित करता है)

पुन: उत्पन्न करने योग्य औसत प्राप्त करने के लिए माइक्रो-बेंचमार्क के लिए समय, मेरा सुझाव है कि आप पहले 10,000 पुनरावृत्तियों को अनदेखा करें और इसके बाद 2-10 सेकंड के लिए इसे चलाएं।

उदा।

long start = 0; 
int runs = 10000; // enough to run for 2-10 seconds. 
for(int i=-10000;i<runs;i++) { 
    if(i == 0) start = System.nanoTime(); 
    // do test 
} 
long time = System.nanoTime() - start; 
System.out.printf("Each XXXXX took an average of %,d ns%n", time/runs); 

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

0

तुम यहाँ अपने जवाब के लिए दे सकता है:

How do I time a method's execution in Java?

वहाँ विधि के निष्पादन समय की गणना करने के कई उदाहरण हैं

+0

हां लेकिन कोई भी जो वास्तव में 'CPU समय' को मापने के तरीके पर अपने प्रश्न का उत्तर नहीं देता है। –

0

प्रोफाइलर (Jprofile, Jprobe, Yourkit) का विश्लेषण करने के लिए उपलब्ध की एक संख्या हैं ऐसा डेटा और न केवल यह है, लेकिन बहुत कुछ ... (जैसे स्मृति उपयोग, धागा विवरण, आदि के रूप में)

21
  1. System.currentTimeMillis() ही कभी wall-clock time, कभी नहीं CPU समय मापेंगे।
  2. यदि आपको दीवार घड़ी का समय चाहिए, तो System.nanoTime() अक्सर currentTimeMillis() से अधिक सटीक (और कभी भी बदतर) नहीं है।
  3. ThreadMXBean.getThreadCPUTime() यह जानने में आपकी सहायता कर सकता है कि दिए गए थ्रेड का कितना CPU समय उपयोग किया गया है। ManagementFactory.getThreadMXBean()ThreadMXBean और Thread.getId() प्राप्त करने के लिए id प्राप्त करने के लिए ManagementFactory.getThreadMXBean() का उपयोग करें। ध्यान दें कि इस विधि को प्रत्येक JVM पर समर्थित नहीं होना चाहिए!
संबंधित मुद्दे