दिलचस्प पोस्ट
PHP में URL पैरामीटर प्राप्त करें जीमेल थ्री-फ्रैग्मेंट एनीमेशन परिदृश्य का पूरा कार्य नमूना? कच्चे HTML कोड प्राप्त करने के लिए जावास्क्रिप्ट का उपयोग करें गिट वर्कफ़्लो और रीबेस बनाम मर्ज प्रश्न विभिन्न पृष्ठभूमि रंगों के साथ दो कॉलम प्राप्त करें जो कि स्क्रीन किनारे तक बढ़तें Django Push उपयोगकर्ताओं को HTTP प्रतिक्रिया एंटीवायरस मेरे निष्पादन योग्य में गलत सकारात्मक सभी पृष्ठों के लिए आम तौर पर लेआउट के लिए डेटा पास करें क्या आप JSON ऑब्जेक्ट में एक पीछे वाले अल्पविराम का उपयोग कर सकते हैं? एंड्रॉइड – बटन दोहराएँ कार्रवाई को पकड़ो मुग़ूज़ को उप-दस्तावेज सरणी वस्तुओं के लिए _id गुण बनाने से रोकें पता लगाया जा रहा है कि एक एप्लीकेशन स्थापित है या नहीं? परिभाषित () बनाम const सी # में एक पाठ फ़ाइल से एक पंक्ति को कैसे हटाएं? तेजी से धागा सुरक्षित सरणी बनाएं

Std :: system_clock और std :: steady_clock के बीच अंतर?

std::system_clock और std::steady_clock बीच अंतर क्या है? (एक उदाहरण का मामला जो अलग-अलग परिणामों / व्यवहारों को स्पष्ट करता है, महान होगा)।

यदि मेरा लक्ष्य फ़ंक्शन के निष्पादन समय को ठीक करना है (जैसे बेंचमार्क), तो std::system_clock , std::steady_clock और std::high_resolution_clock बीच सबसे अच्छा विकल्प क्या होगा?

वेब के समाधान से एकत्रित समाधान "Std :: system_clock और std :: steady_clock के बीच अंतर?"

N3376 से:

20.11.7.1 [time.clock.system] / 1:

क्लास के ऑब्जेक्ट system_clock सिस्टम-वाइड रीयलटाइम घड़ी से दीवार घड़ी समय का प्रतिनिधित्व करते हैं।

20.11.7.2 [time.clock.steady] / 1:

कक्षा steady_clock वस्तुओं के ऑब्जेक्ट्स घड़ियों का प्रतिनिधित्व करते हैं जिसके लिए समय की time_point मूल्यों को भौतिक समय अग्रिम के रूप में कभी नहीं घटाना time_point और वास्तविक समय के सापेक्ष स्थिर दर पर समय-समय के अग्रिम मूल्यों के लिए। यही है, घड़ी समायोजित नहीं किया जा सकता है।

20.11.7.3 [समय.क्लॉक.इयेस] / 1:

क्लास के ऑब्जेक्ट्स high_resolution_clock कम से कम टिक अवधि के साथ घड़ियों का प्रतिनिधित्व करते हैं। high_resolution_clock system_clock या steady_clock लिए समानार्थक हो सकता है

उदाहरण के लिए, सिस्टम चौड़ी घड़ी कुछ दिन से डेलाइट बचत समय से प्रभावित हो सकती है, जिस पर भविष्य में किसी बिंदु पर वास्तविक समय वास्तव में अतीत में एक समय हो सकता है। (उदाहरण के तौर पर अमेरिका में, गिरावट के समय में एक घंटा पीछे जाता है, इसलिए एक ही घंटे "दो बार" अनुभव किया जाता है) हालांकि, ऐसी चीज़ों से steady_clock की अनुमति नहीं है।

इस मामले में "स्थिर" के बारे में सोचने का एक और तरीका 20.11.3 [समय.क्लॉक.रेक] / 2 की तालिका में निर्धारित आवश्यकताओं में है:

तालिका 59 C1 और C2 घड़ी प्रकार निरूपित। t1 और t1 का मूल्य C1::now() द्वारा लौटाए गए C1::now() जहां कॉल t1 लौटने से पहले कॉल 2 आने से पहले होता है और इन दोनों कॉल्स C1::time_point::max() से पहले होते हैं। [नोट: इसका मतलब है कि C1 t1 और t1 बीच लपेट नहीं करता था -नोट नोट]

अभिव्यक्ति: C1::is_steady
रिटर्न: const bool
परिचालन सिमेंटिक्स: अगर t1 <= t2 हमेशा सच है और घड़ी की टिक के बीच का समय स्थिर है, अन्यथा false

ये सभी मानक उनके मतभेदों पर हैं

यदि आप बेंचमार्किंग करना चाहते हैं, तो आपका सर्वोत्तम शर्त संभवतः std::high_resolution_clock होने जा रहा है, क्योंकि यह संभव है कि आपका प्लेटफ़ॉर्म इस घड़ी के लिए एक उच्च रिज़ॉल्यूशन टाइमर (जैसे कि std::high_resolution_clock का उपयोग करता है (संपादित करें: विजुअल स्टूडियो 2013 के रूप में, एमएसवीसी ++, अभी तक इस घड़ी के लिए QueryPerformanceCounter उपयोग नहीं करता है :() हालांकि, अगर आप बेंचमार्किंग कर रहे हैं, तो आपको अपने बेंचमार्क के लिए प्लेटफ़ॉर्म विशिष्ट टाइमर का उपयोग करने पर विचार करना चाहिए, क्योंकि विभिन्न प्लेटफ़ॉर्म अलग-अलग तरीके से इसे संभालते हैं। उदाहरण के तौर पर, कुछ प्लेटफ़ॉर्म आपको घड़ी की वास्तविक संख्या का निर्धारण करने के कुछ साधन दे सकता है, आवश्यक प्रोग्राम (एक ही सीपीयू पर चलने वाली अन्य प्रक्रियाओं से स्वतंत्र) को टिकी करता है। अभी तक, अपने हाथों को एक असली प्रोफाइलर पर प्राप्त करें और इसका इस्तेमाल करें

बिली ने आईएसओ सी ++ मानक के आधार पर एक बहुत अच्छा जवाब दिया जो मैं पूरी तरह सहमत हूं। हालांकि कहानी का एक और पहलू है – वास्तविक जीवन ऐसा लगता है कि अभी भी लोकप्रिय कंपलर्स के कार्यान्वयन में उन घड़ियों के बीच कोई अंतर नहीं है:

जीसीसी 4.8:

 #ifdef _GLIBCXX_USE_CLOCK_MONOTONIC ... #else typedef system_clock steady_clock; #endif typedef system_clock high_resolution_clock; 

विजुअल स्टूडियो 2012:

 class steady_clock : public system_clock { // wraps monotonic clock public: static const bool is_monotonic = true; // retained static const bool is_steady = true; }; typedef system_clock high_resolution_clock; 

जीसीसी के मामले में आप जांच कर सकते हैं कि क्या आप स्थिर घड़ी से निपटने के लिए केवल तदनुसार जाँच कर is_steady और तदनुसार व्यवहार करते हैं। हालांकि VS2012 थोड़ा यहाँ धोखा करने के लिए लगता है 🙂

यदि आपको उच्च सटीक घड़ी की आवश्यकता है तो मैं सिफ़ारिश करता हूँ कि अब अपना खुद का घड़ी लिखना जो C + + 11 आधिकारिक घड़ी इंटरफ़ेस के अनुरूप है और पकड़ने के लिए लागू करने के लिए प्रतीक्षा करें। यह ओएस विशिष्ट एपीआई सीधे आपके कोड में इस्तेमाल करने की तुलना में बेहतर होगा। विंडोज के लिए आप ऐसा कर सकते हैं:

 // Self-made Windows QueryPerformanceCounter based C++11 API compatible clock struct qpc_clock { typedef std::chrono::nanoseconds duration; // nanoseconds resolution typedef duration::rep rep; typedef duration::period period; typedef std::chrono::time_point<qpc_clock, duration> time_point; static bool is_steady; // = true static time_point now() { if(!is_inited) { init(); is_inited = true; } LARGE_INTEGER counter; QueryPerformanceCounter(&counter); return time_point(duration(static_cast<rep>((double)counter.QuadPart / frequency.QuadPart * period::den / period::num))); } private: static bool is_inited; // = false static LARGE_INTEGER frequency; static void init() { if(QueryPerformanceFrequency(&frequency) == 0) throw std::logic_error("QueryPerformanceCounter not supported: " + std::to_string(GetLastError())); } }; 

लिनक्स के लिए यह भी आसान है। बस clock_gettime के मैन पेज को clock_gettime और उपरोक्त कोड को संशोधित करें।

जीसीसी 5.3.0 (सी ++ जीडीसी स्रोत के अंदर सीडीडीआईबी है):

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

फिर CLOCK_REALTIME बनाम CLOCK_MONOTONIC पर समझाया गया है: CLOCK_REALTIME और CLOCK_MONOTONIC में अंतर?