समस्या यह है कि सी और सी ++ में कई अलग-अलग समय फ़ंक्शन उपलब्ध हैं, और उनमें से कुछ कार्यान्वयन के बीच व्यवहार में भिन्न हैं। बहुत सारे आधे-अधूरे जवाब भी तैर रहे हैं। उनके गुणों के साथ घड़ी के कार्यों की एक सूची संकलित करने से प्रश्न का उत्तर ठीक से मिल जाएगा। शुरुआत के लिए आइए पूछते हैं कि वे कौन से प्रासंगिक गुण हैं जिनकी हम तलाश कर रहे हैं। आपके पोस्ट को देखते हुए, मेरा सुझाव है:
- घड़ी को किस समय मापा जाता है? (वास्तविक, उपयोगकर्ता, सिस्टम, या, उम्मीद नहीं, दीवार-घड़ी?)
- घड़ी की शुद्धता क्या है? (एस, एमएस, µs, या तेज?)
- घड़ी के चारों ओर कितने समय के बाद लपेटता है? या इससे बचने के लिए कुछ तंत्र है?
- क्या घड़ी मोनोटोनिक है, या यह सिस्टम समय (एनटीपी, समय क्षेत्र, दिन के उजाले बचत समय, उपयोगकर्ता द्वारा, आदि) में परिवर्तन के साथ बदल जाएगा?
- कार्यान्वयन के बीच उपरोक्त कैसे भिन्न होते हैं?
- क्या विशिष्ट कार्य अप्रचलित है, गैर मानक है, आदि?
सूची शुरू करने से पहले, मैं यह बताना चाहता हूं कि दीवार-घड़ी का समय उपयोग करने के लिए शायद ही सही समय है, जबकि यह समय क्षेत्र में परिवर्तन, दिन के उजाले की बचत के समय के साथ बदलता है, या अगर दीवार घड़ी को NTP द्वारा सिंक्रनाइज़ किया जाता है। अगर आप घटनाओं को शेड्यूल करने या बेंचमार्क प्रदर्शन के लिए समय का उपयोग कर रहे हैं, तो इनमें से कोई भी चीज अच्छी नहीं है। यह केवल वास्तव में अच्छा है कि नाम क्या कहता है, दीवार पर एक घड़ी (या डेस्कटॉप)।
यहाँ मैंने लिनक्स और OS X में घड़ियों के लिए अब तक क्या पाया है:
time()
ओएस से दीवार-घड़ी का समय, सेकंड में परिशुद्धता के साथ।
clock()
लगता है कि उपयोगकर्ता और सिस्टम समय का योग है। यह C89 और बाद में मौजूद है। एक समय में यह चक्रों में सीपीयू समय माना जाता था, लेकिन पोसिक्स जैसे आधुनिक मानकों को 1000000 होने के लिए CLOCKS_PER_SEC की आवश्यकता होती है, जिससे अधिकतम 1 of की संभावित सटीकता प्राप्त होती है। मेरे सिस्टम पर सटीकता वास्तव में 1 is है। एक बार टॉप करने के बाद यह घड़ी घूमती है (यह आम तौर पर ~ 2 ^ 32 टिक के बाद होता है, जो 1 मेगाहर्ट्ज घड़ी के लिए बहुत लंबा नहीं है)। man clock
कहते हैं कि glibc 2.18 के बाद से इसे clock_gettime(CLOCK_PROCESS_CPUTIME_ID, ...)
लिनक्स में लागू किया गया है।
clock_gettime(CLOCK_MONOTONIC, ...)
नैनोसेकंड रिज़ॉल्यूशन प्रदान करता है, मोनोटोनिक है। मेरा मानना है कि 'सेकंड' और 'नैनोसेकंड' अलग-अलग स्टोर किए जाते हैं, प्रत्येक में 32-बिट काउंटर होते हैं। इस प्रकार, कोई भी लपेटो-अप कई दर्जन वर्षों के समय के बाद होगा। यह एक बहुत अच्छी घड़ी की तरह दिखता है, लेकिन दुर्भाग्य से यह अभी तक ओएस एक्स पर उपलब्ध नहीं है। पोसिक्स 7 एक वैकल्पिक विस्तार के रूप में वर्णन CLOCK_MONOTONIC
करता है ।
getrusage()
मेरी स्थिति के लिए सबसे अच्छा विकल्प निकला। यह उपयोगकर्ता और सिस्टम बार अलग-अलग रिपोर्ट करता है और चारों ओर लपेटता नहीं है। मेरे सिस्टम पर सटीकता 1 is है, लेकिन मैंने इसे लिनक्स सिस्टम (Red Hat 4.1.2-48 के साथ GCC 4.1.2) पर भी परीक्षण किया था और वहां परिशुद्धता केवल 1 ms की थी।
gettimeofday()
(नाममात्र) सटीक के साथ दीवार-घड़ी का समय देता है। मेरे सिस्टम पर इस घड़ी में buts परिशुद्धता लगती है, लेकिन इसकी गारंटी नहीं है, क्योंकि "सिस्टम क्लॉक का रिज़ॉल्यूशन हार्डवेयर पर निर्भर है" । POSIX.1-2008 कि कहते हैं । "अनुप्रयोगों को clock_gettime()
समारोह के बजाय फंक्शन का उपयोग करना चाहिए gettimeofday()
", इसलिए आपको इससे दूर रहना चाहिए। लिनक्स x86 और इसे सिस्टम कॉल के रूप में लागू करता है ।
mach_absolute_time()
OS X पर बहुत अधिक रिज़ॉल्यूशन (ns) समय के लिए एक विकल्प है। मेरे सिस्टम पर, यह वास्तव में ns रिज़ॉल्यूशन देता है। सिद्धांत रूप में यह घड़ी चारों ओर घूमती है, हालाँकि यह 64-बिट अहस्ताक्षरित पूर्णांक का उपयोग करके ns का भंडारण कर रहा है, इसलिए चारों ओर लपेटना व्यवहार में कोई समस्या नहीं होनी चाहिए। पोर्टेबिलिटी संदिग्ध है।
- मैंने इस स्निपेट के आधार पर एक हाइब्रिड फ़ंक्शन लिखा है जो लिनक्स पर संकलित होने पर, या OS X पर संकलित करने के लिए, OS पर संकलित होने पर घड़ी_गेटाइम का उपयोग करता है, जो मच टाइमर का उपयोग करता है।
उपर्युक्त सभी लिनक्स और ओएस एक्स दोनों में मौजूद हैं, जहां अन्यथा निर्दिष्ट नहीं है। ऊपर में "मेरा सिस्टम" मैकपॉर्ट्स से GCC 4.7.2 के साथ एक Apple OS OS 10.8.3 चल रहा है।
अंत में, यहां उन संदर्भों की एक सूची दी गई है जो मुझे ऊपर दिए गए लिंक के अलावा मददगार लगे:
अपडेट : ओएस एक्स के लिए, clock_gettime
10.12 (सिएरा) के रूप में लागू किया गया है। इसके अलावा, POSIX और BSD आधारित प्लेटफ़ॉर्म (जैसे OS X) दोनों ही rusage.ru_utime
संरचनात्मक क्षेत्र को साझा करते हैं ।
clock_gettime
, इसलिए उपयोगgettimeofday()
की तुलना में अधिक बहुमुखी एक छोटे से किया जा रहा हैclock_gettime()