2012-11-26 11 views
5

मैं बूस्ट का उपयोग कर मिलीसेकंद परिशुद्धता के साथ समय प्राप्त करना चाहता हूं। (। सटीकता मिलीसेकंड, बस पास होने की जरूरत नहीं है)बढ़ावा है :: posix_time :: microsec_clock CPU गहन?

Local time with milliseconds, और दूसरों की चर्चा करते हुए यह संकेत दिया गया है कि माइक्रोसेकंड घड़ी इस्तेमाल किया जाना चाहिए:

boost::posix_time::microsec_clock::local_time(); 

मेरे अनुभव में, यह असंभव है मानक, कम प्रभाव वाली सिस्टम कॉल (यानी, ::GetTicks() विंडोज़) के साथ माइक्रोसेकंड (कुछ समान सटीकता मानते हुए) की सटीकता के लिए समय प्राप्त करने के लिए। इसके बजाय, मिलीसेकंड (माइक्रोसेकंड में) से परे सटीकता को बेहतर बनाने के लिए सीपीयू-गहन कॉल जारी किए जाने की आवश्यकता है। परिशुद्धता millisecond के लिए सिर्फ कुछ हद तक करीब -

मैं उल्लेख किया है, मैं माइक्रोसेकंड परिशुद्धता जरूरत नहीं है। हालांकि, Boost.Date_Time किसी भी "millisec_clock" प्रदान नहीं करता है - यह एक second_clock प्रदान करता है, और अगले उन्नयन microsec_clock है, कोई "millisec_clock" के बीच में है।

यदि मैं microsec_clock का उपयोग करता हूं, जैसा कि नोट किया गया है, मिलिस्सेकंड प्राप्त करने के लिए, क्या मुझे एक सीपीयू-गहन कॉल के साथ मारा जाएगा?

उत्तर

1

Relevant documentation के अनुसार:

सबसे Win32 प्लेटफार्मों पर यह ftime का उपयोग कर कार्यान्वित किया जाता है। Win32 सिस्टम अक्सर इस एपीआई के माध्यम से microsecond संकल्प प्राप्त नहीं करते हैं। यदि आपके आवेदन के लिए उच्च रिज़ॉल्यूशन महत्वपूर्ण है तो प्राप्त प्लेटफ़ॉर्म को देखने के लिए अपने प्लेटफ़ॉर्म का परीक्षण करें।

ftime एक अत्यधिक भारी फ़ंक्शन (here is a question about how it works) प्रतीत नहीं होता है, लेकिन मुझे लगता है कि यह CPU- गहन के आपके विचार पर निर्भर करता है।

5

मैं) एक समारोह के अंदर बिताए समय को मापने के लिए, :: बढ़ावा का उपयोग कर DATE_TIME वस्तुओं का इस्तेमाल किया एक सहायक ऑब्जेक्ट किया था और especifically मैं microsec_clock :: LOCAL_TIME इस्तेमाल किया (।

मैं इस ऑब्जेक्ट का उपयोग विभिन्न कार्यों (एक तनाव परीक्षण मामले) के लिए कुछ मिलियन त्वरित कॉल को मापने के लिए कर रहा था और मैंने ध्यान दिया कि मैं अपनी प्रक्रिया के निष्पादन समय के बहुत से समय तक नहीं खाता। कुछ प्रयोगों के बाद मैंने इन काउंटरों में से अधिकांश को हटा दिया और मेरे कोड का कुल निष्पादन समय ~ 23 मिनट से लगभग 12 मिनट (लगभग 50% !!)

तो, मेरे अनुभव से आपके प्रश्न का उत्तर देने के लिए, microsec_clock: : local_time() विस्तारित है।

यह देखने के बाद मैंने microsec_clock :: universal_time() microsec_clock :: local_time() के बजाय एक परीक्षण किया और यह निश्चित रूप से मेरे रन टाइम के लिए एक सुधार था। यह अभी भी लगभग 3 मिनट जोड़ा गया है, लेकिन यह 10 मिनट से बेहतर है: पी। इसके बारे में सोचते हुए, मुझे लगता है कि समस्या यह है कि स्थानीय_टाइम() समय क्षेत्र के लिए समय मूल्य को ऑफ़सेट करता है, जो मेरे मामले में आवश्यक नहीं था (क्योंकि मुझे केवल समय में अंतर की आवश्यकता थी)। मुझे अभी भी यह जांचने के लिए एक परीक्षण करना है कि क्या अन्य विधियां तेज हैं (जैसे clock_gettime)।

मुझे आशा है कि इस उत्तर का प्रकार आप के लिए देख रहे थे।

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

  • कोई संबंधित समस्या नहीं^_^