2013-09-27 3 views
55

आज मैं एक छोटे से जल्दी बेंचमार्क System.nanoTime() और System.currentTimeMillis() की गति प्रदर्शन का परीक्षण करने के लिए क्या किया:System.cnrentTimeMillis() से System.nanoTime() तरीका धीमा (प्रदर्शन में) क्यों है?

System.currentTimeMillis(): average of 12.7836022/function call 
System.nanoTime():   average of 34.6395674/function call 

इतना बड़ा चल रहा है गति में अंतर क्यों कर रहे हैं:

long startTime = System.nanoTime(); 

for(int i = 0; i < 1000000; i++) { 
    long test = System.nanoTime(); 
} 

long endTime = System.nanoTime(); 

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

यह परिणाम हैं?

बेंचमार्क प्रणाली:

Java 1.7.0_25 
Windows 8 64-bit 
CPU: AMD FX-6100 
+0

संभावित डुप्लिकेट [System.nanoTime() और System.currentTimeMillis() इतनी तेज़ी से अलग क्यों हो जाते हैं?] (Http://stackoverflow.com/questions/5839152/why-do-system-nanotime-and-system -कुरेंटटिमिमिलिस-ड्रिफ्ट-अलग-तेज़ी से) – chrylis

+0

यह पोस्ट आपके प्रश्न का उत्तर दे सकता है: http://stackoverflow.com/a/5839267/658907 – matts

+0

'नैनोटाइम 'वर्तमान टाइममिलिस' से अधिक सटीक है, यही कारण हो सकता है। – Thomas

उत्तर

61

this Oracle blog से:

System.currentTimeMillis() GetSystemTimeAsFileTime विधि है, जो अनिवार्य सिर्फ कम संकल्प समय दिन-का-मूल्य है जो Windows का कहना है पढ़ता का उपयोग कर कार्यान्वित किया जाता है। यह वैश्विक चर स्वाभाविक रूप से बहुत तेज़ है - के अनुसार लगभग 6 चक्रों की सूचना दी गई है।

System.nanoTime() का उपयोग कर कार्यान्वित किया जाता है QueryPerformanceCounter/ QueryPerformanceFrequency API (यदि उपलब्ध हो, वरना यह रिटर्न currentTimeMillis*10^6)QueryPerformanceCounter(QPC) अलग अलग तरीकों से हार्डवेयर उस पर चल रहा है पर निर्भर करता है में किया जाता है। आम तौर पर यह या तो प्रोग्राम अंतराल टाइमर का उपयोग करेगा (पीआईटी), या एसीपीआई पावर प्रबंधन टाइमर (पीएमटी), या सीपीयू-स्तरीय टाइमस्टैम्प-काउंटर (टीएससी) पीआईटी/पीएमटी तक पहुंचने के लिए धीमी आई/ओ बंदरगाह निर्देश निष्पादन की आवश्यकता होती है और इसके परिणामस्वरूप निष्पादन समय क्यूपीसी माइक्रोसेकंड के क्रम में है। इसके विपरीत टीएससी पढ़ने के क्रम में है 100 घड़ी चक्र (चिप से टीएससी पढ़ने के लिए और ऑपरेटिंग आवृत्ति के आधार पर इसे एक समय मान में परिवर्तित करें)।

शायद यह सवाल का जवाब है। दो विधियां विभिन्न प्रकार के घड़ी चक्र का उपयोग करती हैं, जिसके परिणामस्वरूप बाद में धीमी गति होती है।

निष्कर्ष खंड में है कि ब्लॉग में आगे

:

आप को मापने/बीता हुआ समय की गणना में रुचि रखते हैं, तो हमेशा System.nanoTime का उपयोग()। अधिकांश प्रणालियों पर यह microseconds के आदेश पर एक संकल्प देगा। हालांकि, पर ध्यान रखें, यह कॉल कुछ प्लेटफार्मों पर निष्पादित करने के लिए माइक्रोसेकंड भी ले सकता है।

+10

अच्छा जवाब। यह भी वेबसाइट: http://stas-blogspot.blogspot.nl/2012/02/what-is-behind-systemnanotime.html किसी ने थोड़ा सा शोध किया और विभिन्न ओएस पर System.nanoTime के पीछे स्रोत कोड भी दिखाता है। – MystyxMac

23

अधिकांश ओएस (आप जो एक प्रयोग कर रहे हैं उल्लेख नहीं था) स्मृति काउंटर/घड़ी जो मिलीसेकंड सटीकता (या कि के करीब) प्रदान करता है में एक है। नैनोसेकंद सटीकता के लिए अधिकांश को हार्डवेयर काउंटर को पढ़ना होता है। हार्डवेयर के साथ संचार धीमा है, फिर पहले से ही स्मृति में कुछ मूल्य पढ़ रहा है।

3

यह केवल विंडोज़ पर ही मामला हो सकता है। एक समान प्रश्न के लिए this answer देखें।

असल में, System.currentTimeMillis() सिर्फ विंडोज द्वारा बनाए गए वैश्विक चर को पढ़ता है (जो कि इसकी कम ग्रैन्युलरिटी है), जबकि System.nanoTime() वास्तव में आईओ ऑपरेशंस करना है।

0

आप विंडोज़ पर यह माप रहे हैं, आप नहीं हैं। मैं 2008 में इस अभ्यास के माध्यम से चला गया। नैनोटाइम वर्तमान टाइममिलिस की तुलना में विंडोज पर धीमा है। जैसा कि मुझे याद है, लिनक्स पर, नैनोटाइम वर्तमान टाइममिलिस से तेज है और विंडोज़ की तुलना में निश्चित रूप से तेज़ है।

ध्यान देने योग्य महत्वपूर्ण बात यह है कि यदि आप एकाधिक उप-मिलीसेकंद संचालन के कुल को मापने की कोशिश कर रहे हैं, तो आपको नैनोटाइम का उपयोग करना चाहिए जैसे कि ऑपरेशन आपके दूसरे कोड के 1/1000 वें से कम में समाप्त हो गया है, वर्तमान टाइममिलिस की तुलना में दिखाया जाएगा ऑपरेशन तात्कालिक के रूप में इनमें से 1,000 अभी भी तात्कालिक हो जाएगा। आप क्या करना चाहते हो सकता है उपयोग nanotime तो निकटतम मिलीसेकंड के दौर है, इसलिए यदि एक ऑपरेशन 8000 नैनोसेकंड ले लिया यह 1 मिलीसेकंड, नहीं 0.

0

आप क्या करना चाहते हो सकता है है उपयोग nanotime तो रूप में गिना जाएगा

8000 नैनोसेकंड 8 माइक्रोसेकंड 0.008 मिलीसेकेंड है: निकटतम मिलीसेकंड के दौर है, इसलिए यदि एक ऑपरेशन 8000 नैनोसेकंड ले लिया यह 1 मिलीसेकंड, नहीं 0.

अंकगणित नोट के रूप में गिना जाएगा। गोलाकार 0 मिलीसेकंड तक ले जाएगा।

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