लिनक्स में समय को मापें - समय बनाम घड़ी बनाम getrusage बनाम clock_gettime बनाम gettimeofday बनाम timespec_get?


148

समय कार्यों के अलावा, time, clock getrusage, clock_gettime, gettimeofdayऔर timespec_get, मैं स्पष्ट रूप से समझने के लिए कि वे किस तरह लागू किया जाता है चाहते हैं और क्रम में पता करने की जो स्थिति में मैं उन्हें उपयोग करने के लिए में उनकी वापसी मूल्यों क्या कर रहे हैं।

सबसे पहले हमें दीवार-घड़ी के मूल्यों को लौटाने वाले कार्यों को वर्गीकृत करने की आवश्यकता है जो कि रिटर्निंग प्रक्रिया या थ्रेड्स मानों की तुलना करते हैंgettimeofdayरिटर्न वॉल-क्लॉक वैल्यू, clock_gettimeरिटर्न वॉल-क्लॉक वैल्यू या प्रोसेस या थ्रेड्स वैल्यूज के आधार पर Clockइसे पास किया गया है। getrusageऔर clockवापसी प्रक्रिया मान।

फिर दूसरा प्रश्न इन कार्यों के कार्यान्वयन और परिणामस्वरूप, उनकी सटीकता के संबंध में है। कौन सा हार्डवेयर या सॉफ्टवेयर तंत्र इन कार्यों का उपयोग करता है।

ऐसा लगता है कि getrusageकेवल कर्नेल टिक (आमतौर पर 1ms लंबा) का उपयोग करता है और परिणामस्वरूप एमएस से अधिक सटीक नहीं हो सकता है। क्या यह सही है? तब getimeofdayफ़ंक्शन उपलब्ध सबसे सटीक अंतर्निहित हार्डवेयर का उपयोग करने लगता है। परिणामस्वरूप इसकी सटीकता आमतौर पर हाल के हार्डवेयर पर माइक्रोसेकंड (एपीआई के कारण अधिक नहीं हो सकती) है। क्या के बारे में clock, आदमी पृष्ठ "सन्निकटन" के बारे में बात करता है, इसका क्या मतलब है? के बारे में क्या है clock_gettime, एपीआई नैनोसेकंड में है, क्या इसका मतलब है कि यदि अंतर्निहित हार्डवेयर इसे अनुमति देता है तो यह कितना सटीक है? एकरसता के बारे में क्या?

क्या कोई अन्य कार्य हैं?

जवाबों:


198

समस्या यह है कि सी और सी ++ में कई अलग-अलग समय फ़ंक्शन उपलब्ध हैं, और उनमें से कुछ कार्यान्वयन के बीच व्यवहार में भिन्न हैं। बहुत सारे आधे-अधूरे जवाब भी तैर रहे हैं। उनके गुणों के साथ घड़ी के कार्यों की एक सूची संकलित करने से प्रश्न का उत्तर ठीक से मिल जाएगा। शुरुआत के लिए आइए पूछते हैं कि वे कौन से प्रासंगिक गुण हैं जिनकी हम तलाश कर रहे हैं। आपके पोस्ट को देखते हुए, मेरा सुझाव है:

  • घड़ी को किस समय मापा जाता है? (वास्तविक, उपयोगकर्ता, सिस्टम, या, उम्मीद नहीं, दीवार-घड़ी?)
  • घड़ी की शुद्धता क्या है? (एस, एमएस, µ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_gettime10.12 (सिएरा) के रूप में लागू किया गया है। इसके अलावा, POSIX और BSD आधारित प्लेटफ़ॉर्म (जैसे OS X) दोनों ही rusage.ru_utimeसंरचनात्मक क्षेत्र को साझा करते हैं ।


मैक ओएस एक्स नहीं है clock_gettime, इसलिए उपयोग gettimeofday()की तुलना में अधिक बहुमुखी एक छोटे से किया जा रहा हैclock_gettime()
bobobobo

1
आपने उल्लेख नहीं किया है times()(एक एस के साथ), जो कि पीओएसआईएक्स में मौजूद है। इशू 1 से संबंधित है। जीएनयू / लिनक्स के बारे में: घड़ी के अनुसार (3) मैन पेज, clock()ग्लिबैक 2.17 से और इससे पहले इसके शीर्ष पर लागू किया गया था, लेकिन सुधार के लिए परिशुद्धता, अब इसे शीर्ष पर लागू किया जाता है clock_gettime(CLOCK_PROCESS_CPUTIME_ID,...), जो POSIX में भी निर्दिष्ट है लेकिन वैकल्पिक है।
vinc17 15

2
@starflyer घड़ी की सटीकता को आंशिक रूप से उस घड़ी को प्रदूषित करने में लगने वाले समय द्वारा सीमित किया गया है। ऐसा इसलिए है, क्योंकि अगर मैं घड़ी को कॉल करता हूं और वापस लौटने में 1 I का समय लगता है, तो घड़ी का समय कॉल करने वाले के नजरिए से 1 I बंद हो जाएगा। इसका मतलब है कि एक अत्यधिक सटीक घड़ी भी कम विलंबता होनी चाहिए। इसलिए आमतौर पर आपके पास जिस ट्रेड-ऑफ की बात नहीं होती है: सबसे सस्ती घड़ियां भी सबसे सटीक होंगी।
डगलस बी। स्टैपल

3
इसके अलावा, अधिकांश घड़ियों को दिन के समय / समय क्षेत्र की बचत के बारे में परवाह नहीं है, भले ही उन्हें दीवार घड़ियां माना जाता है । दोनों timeऔर gettimeofdayवापसी, कम से कम आजकल, सेकंड के बाद से युग (उर्फ यूनिक्स-टाइमस्टैम्प)। यह समय क्षेत्र / डीएसटी से स्वतंत्र है। लीप सेकंड एक और कहानी है ...
झूलन

2
Android उपयोगकर्ताओं के लिए, CLOCK_MONOTONIC का उपयोग करना समस्याग्रस्त हो सकता है क्योंकि ऐप घड़ी के साथ निलंबित हो सकता है। उसके लिए, Android ने ANDROID_ALARM_ELAPSED_REALTIME टाइमर जोड़ा जो कि ioctl के माध्यम से सुलभ है। इन और अन्य निलंबित संबंधित जानकारी के बारे में कुछ जानकारी यहाँ
इता बियानको

17

C11 timespec_get

उदाहरण उदाहरण: https://stackoverflow.com/a/36095407/895245 पर

वापस लौटाए गए अधिकतम संभावित सटीक नैनोसेकंड हैं, लेकिन वास्तविक सटीक कार्यान्वयन को परिभाषित किया गया है और छोटा हो सकता है।

यह सीपीयू उपयोग नहीं, दीवार समय देता है।

glibc 2.21 इसके तहत लागू होता है sysdeps/posix/timespec_get.cऔर यह सीधे आगे की ओर होता है:

clock_gettime (CLOCK_REALTIME, ts) < 0)

clock_gettimeऔर CLOCK_REALTIMEPOSIX http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html हैं , और man clock_gettimeकहते हैं कि यदि आपके सिस्टम के चलने के दौरान कुछ सिस्टम टाइम सेटिंग बदल जाती है तो इस उपाय में असंतोष हो सकता है।

सी ++ 11 क्रोनो

चूंकि हम इस पर हैं, तो उन्हें भी कवर करें: http://en.cppreference.com/w/cpp/chrono

GCC 5.3.0 (C ++ stdlib GCC स्रोत के अंदर है):

  • high_resolution_clock के लिए एक उपनाम है system_clock
  • system_clock निम्नलिखित में से पहले के लिए उपलब्ध है:
    • clock_gettime(CLOCK_REALTIME, ...)
    • gettimeofday
    • time
  • steady_clock निम्नलिखित में से पहले के लिए उपलब्ध है:
    • clock_gettime(CLOCK_MONOTONIC, ...)
    • system_clock

पर पूछा: एसटीडी के बीच का अंतर :: system_clock और std :: stabil_clock?

CLOCK_REALTIMEबनाम CLOCK_MONOTONIC: CLOCK_REALTIME और CLOCK_MONOTONIC में अंतर?


1
महान उत्तर जो विशिष्ट कार्यान्वयन को ध्वस्त करते हैं। यही लोगों को वास्तव में जानने की जरूरत है।
काल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.