c++ - लिनक्स पर पीछे की ओर चलने से समय कैसे रोकें?




linux time (4)

यहां एक छोटा परीक्षण है जिसे मैंने सत्यापित करने के लिए लिखा है कि समय वास्तव में केवल लिनक्स में आगे बढ़ता है।

#include <time.h>
#include <sys/time.h>  

bool timeGoesForwardTest2()
{
   timeval tv1, tv2;   
   double startTime = getTimeSeconds();  // my function

   while ( getTimeSeconds() - startTime < 5 )
   {
      gettimeofday( &tv1, NULL );  
      gettimeofday( &tv2, NULL );  

      if ( tv2.tv_usec == tv1.tv_usec &&
           tv2.tv_sec == tv1.tv_sec )
      {
         continue;  // Equal times are allowed.
      }

      // tv2 should be greater than tv1
      if ( !( tv2.tv_usec>tv1.tv_usec ||
              tv2.tv_sec-1 == tv1.tv_sec ) )
      {
         printf( "tv1: %d %d\n", int( tv1.tv_sec ), int( tv1.tv_usec ) );
         printf( "tv2: %d %d\n", int( tv2.tv_sec ), int( tv2.tv_usec ) );
         return false;
      }         
   }
   return true;
}

परिणाम परिणाम के साथ विफल रहता है।

 tv1: 1296011067 632550
 tv2: 1296011067 632549

ummm ....

ऐसा क्यों होता है?

मेरा सेटअप यहाँ है:

Linux version 2.6.35-22-generic ([email protected]) (gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu4) ) #33-Ubuntu SMP Sun Sep 19 20:34:50 UTC 2010 (Ubuntu 2.6.35-22.33-generic 2.6.35.4)
... running inside VirtualBox 3.2.12, in Windows 7.

अधिकांश मशीनों पर मशीन टाइमर के पास केवल 15 उपयोगक परिशुद्धता होती है (यहां तक ​​कि देशी कोड तक)। समय 'पिछड़ा' समय अजीब है, लेकिन आप वास्तव में उस स्तर (1 usec) पर भरोसा नहीं कर सकते हैं। (यह भी ध्यान दें: सटीकता और सटीकता के बीच एक अंतर है; अधिकांश टाइमर की सटीकता इसकी सटीकता से भी बदतर है)। वर्चुअल मशीन का उपयोग इससे भी बढ़ सकता है।

अद्यतन: टाइपो


ऐसा नहीं है कि यह पीछे की ओर चल रहा है। यह कहना बेहतर होगा कि यह सही समय की रिपोर्ट नहीं कर रहा है। ऐसा इसलिए है क्योंकि एक समर्पित समय उपप्रणाली की सहायता के बिना कंप्यूटर, बस एकल मिलीसेकंद अंतराल में बहुत सटीक समय रिपोर्ट करने में सक्षम नहीं हैं।

हार्डवेयर, ओएस और यहां तक ​​कि बिजली की आपूर्ति के साथ परिशुद्धता अलग-अलग होगी। स्टार्टर्स के लिए यहां एक लेख दिया गया है । थोड़ा पुराना लेकिन विचार अच्छी तरह से संवाद करता है।


वर्चुअलबॉक्स बग ट्रैकर पर एक खुली समस्या है । वे ब्लॉग पोस्ट से लिंक करते हैं कि आपको समय बीतने के लिए gettimeofday () का उपयोग क्यों नहीं करना चाहिए :

समय को सही ढंग से मापने का सबसे पोर्टेबल तरीका घड़ी_getटाइम (CLOCK_MONOTONIC, ...) लगता है


gettimeofday() monotonic होने की गारंटी नहीं है। यदि आपको उस गारंटी की आवश्यकता है तो clock_gettime(CLOCK_MONOTONIC) उपयोग करें।





time-t