2008-09-22 10 views
5

मैं एक सी ++ एप्लिकेशन पर काम कर रहा हूं जिसके लिए मिलीसेकंद स्तर तक विस्तृत समय की जानकारी की आवश्यकता है।सी ++ समय, मिलीसेकंड पिछले पूरे दूसरे

हम <ctime> में मानक time() फ़ंक्शन का उपयोग करके दूसरी सटीकता को समय इकट्ठा करना चाहते हैं। हम time() द्वारा दिए गए अंतिम दूसरे के बाद से मिलीसेकंड को अतिरिक्त रूप से इकट्ठा करना चाहते हैं।

क्या कोई इस जानकारी को प्राप्त करने के लिए सुविधाजनक तरीका जानता है?

उत्तर

-1

यदि यह विंडोज के लिए है तो QueryPerformanceCounter विधियों में देखें।

8

इस समस्या का कोई पोर्टेबल समाधान नहीं है, क्योंकि एएनएसआई सी मानक मिलीसेकंड-सटीक समय फ़ंक्शन को परिभाषित नहीं करता है। यदि आप विंडोज का उपयोग कर रहे हैं, तो आप GetTickCount(), timeGetTime(), या QueryPerformanceCounter()/QueryPerformanceFrequency() का उपयोग कर सकते हैं। ध्यान रखें कि इनकी अलग-अलग accuracies और विभिन्न रनटाइम लागत है।

अन्य ऑपरेटिंग सिस्टम में अन्य समान कार्य हैं; मुझे यकीन नहीं है कि वे मेरे सिर के ऊपर से क्या हैं।

0

(c)time.h शीर्षलेख में कुछ भी नहीं ओएस-विशिष्ट विधियों की आवश्यकता है। मेरा मानना ​​है कि उन सभी विधियों का दूसरा संकल्प है।

आप किस ओएस में काम कर रहे हैं?

11

बूस्ट। डेटटाइम में मिलीसेकंड और नैनोसेकंद प्रतिनिधित्व आईएफ अंतर्निहित प्लेटफॉर्म उनका समर्थन करता है। हालांकि यह प्लेटफार्म विशिष्ट कोड का उपयोग कर रहा है, यह उन विवरणों को आपके कोड से बाहर रख रहा है।

यदि यह एक बड़ा सौदा है, तो उनके पास मंच स्वतंत्र उपसेकंद संकल्प करने का एक और तरीका है। This page कुछ पैराग्राफ नीचे कैसे करें इसके बारे में वार्तालाप करते हैं।

, (पृष्ठ से)

उदाहरण के लिए मान लें कि हम एक गिनती है कि एक दूसरे की दसवां का प्रतिनिधित्व करता है का उपयोग कर निर्माण करने के लिए चाहते हैं। यही है, प्रत्येक टिक 0.1 सेकंड है।

int number_of_tenths = 5; 
//create a resolution independent count -- divide by 10 since there are 
//10 tenths in a second. 
int count = number_of_tenths*(time_duration::ticks_per_second()/10); 
time_duration td(1,2,3,count); //01:02:03.5 //no matter the resolution settings 
2

उच्च रिज़ॉल्यूशन, इंटेल प्रोसेसर

आप इंटेल हार्डवेयर पर हैं के लिए कम उपरि समय, यहां सीपीयू वास्तविक समय अनुदेश काउंटर पढ़ने के लिए कैसे। यह आपको प्रोसेसर बूट होने के बाद निष्पादित CPU चक्रों की संख्या बताएगा। यह शायद बेहतरीन माप वाला काउंटर है जिसे आप प्रदर्शन माप के लिए प्राप्त कर सकते हैं।

ध्यान दें कि यह CPU चक्रों की संख्या है। लिनक्स पर आप CPU की गति/proc/cpuinfo से प्राप्त कर सकते हैं और सेकंड की संख्या प्राप्त करने के लिए विभाजित कर सकते हैं। इसे एक डबल में परिवर्तित करना काफी आसान है।

जब मैं अपने बॉक्स पर इस चलाने के लिए, मैं

 
11867927879484732 
11867927879692217 
it took this long to call printf: 207485 

यहाँ Intel developer's guide कि विस्तार के टन देता है।

#include <stdio.h> // stackoverflow bug: pre tag eats the filenames, 
#include <stdint.h> // so i had to put spaces in the angle brackets 

inline uint64_t rdtsc() { 
    uint32_t lo, hi; 
    __asm__ __volatile__ (
     "xorl %%eax, %%eax\n" 
     "cpuid\n" 
     "rdtsc\n" 
     : "=a" (lo), "=d" (hi) 
     : 
     : "%ebx", "%ecx"); 
    return (uint64_t)hi << 32 | lo; 
} 

main() 
{ 
    unsigned long long x; 
    unsigned long long y; 
    x = rdtsc(); 
    printf("%lld\n",x); 
    y = rdtsc(); 
    printf("%lld\n",y); 
    printf("it took this long to call printf: %lld\n",y-x); 
} 
+1

RDTSC अनुदेश हतोत्साहित किया जाता है, क्योंकि यह गलत परिणाम सीपीयू सुप्त अवस्था में चले दे सकता है, और यह भी एक मल्टीकोर प्रणाली की कोर के बीच संगत परिणामों का उत्पादन नहीं करता। –

+1

उन समस्याएं QueryPerformanceTimer के लिए भी लागू होती हैं - http://www.virtualdub.org/blog/pivot/entry.php?id=106 – yrp

+1

एचपीईटी के साथ Vista पर QueryPerformanceCounter() इन समस्याओं में नहीं है, और न ही यह XP/USEPMTIMER के साथ। एएमडी एक प्रोसेसर ड्राइवर प्रदान करता है जो XP पर QPC() सिंक्रनाइज़ेशन को बेहतर बनाता है। आरडीटीएससी का उपयोग करके आप इन सुधारों में से किसी से भी लाभान्वित होने से रोकते हैं। – bk1e

1

आप यूनिक्स पर हैं, तो gettimeofday() सेकंड और माइक्रोसेकंड वापस आ जाएगी , सिस्टम घड़ी के संकल्प तक।

int gettimeofday(struct timeval *tv, struct timezone *tz); 

struct timeval { 
    time_t  tv_sec;  /* seconds */ 
    suseconds_t tv_usec; /* microseconds */ 
}; 
1
#include <ctime> 

clock_t elapsed = static_cast<double>(clock()/CLOCKS_PER_SEC); 

बीत सेकंड में व्यतीत प्रोसेसर समय हो जाएगा।

संकल्प ऑपरेशन सिस्टम निर्भर है, लेकिन आमतौर पर अधिकांश सिस्टम पर मिलीसेकंद रिज़ॉल्यूशन से बेहतर होता है।

-1

इंटेल की Threading Building Blocks library इस के लिए एक समारोह है, लेकिन TBB वर्तमान में इंटेल और क्लोन

+0

वाह, सवाल का जवाब देने के छह साल बाद डाउनवोट, लेकिन डाउनवोट के लिए कोई स्पष्टीकरण नहीं। दुर्भाग्यवश, मैंने उस फ़ंक्शन का संदर्भ नहीं दिया जिसके बारे में मैं सोच रहा था; हो सकता है कि यह 'tick_count' (https://software.intel.com/en-us/node/506283) के साथ कुछ करने के लिए हो। आजकल, मैं '' (http://en.cppreference.com/w/cpp/chrono) में फ़ंक्शंस का उपयोग करूंगा। –

2

अन्य के रूप में कहा है नहीं है (कि PowerPC, एआरएम, आदि है, यह SPARCs पर उपलब्ध नहीं है,), पर केवल उपलब्ध है ऐसा करने के लिए एक पोर्टेबल तरीका नहीं है।

मैं क्या करता हूं (एमएसवीसी ++ और लिनक्स/जी ++ पर) मैं निम्न वर्ग का उपयोग करता हूं जो विंडोज़ पर क्वेरी पेपरफॉर्मेंस काउंटर और लिनक्स पर गेटटाइम का उपयोग करता है। यह एक टाइमर क्लास है जो आपको दो कॉल के बीच विलुप्त समय प्राप्त कर सकती है। आप अपनी जरूरतों को पूरा करने के लिए इसे संशोधित करना चाहेंगे।

#if defined(_MSC_VER) 
# define NOMINMAX // workaround un bug dans windows.h qui define des macros 
        // "min" et "max" qui entrent en conflit avec la STL. 
# include <windows.h> 
#else 
# include <sys/time.h> 
#endif 

namespace Utils 
{ 

    /** 
    * Implémente un chronométre qui mesure le temps etre deux appels. 
    */ 
    class CTimer 
    { 
    private: 
#  if defined(_MSC_VER) 
     LARGE_INTEGER m_depart; 
#  else 
     timeval m_depart; 
#  endif 

    public: 
     /** 
     * Démarre le timer. 
     * 
     * Cette fonction sert à démarrer le timer. Si le timer est déja 
     * démarrer, elle le redémarre simplement. 
     */ 
     inline void start() 
     { 
#  if defined(_MSC_VER) 
      QueryPerformanceCounter(&m_depart); 
#  else 
      gettimeofday(&m_depart, 0); 
#  endif 

     }; 

     /** 
     * Retourne le nombre de secondes depuis le départ du timer. 
     * 
     * @return Nombre de secondes écoulés depuis le départ du timer 
     */ 
     inline float GetSecondes() const 
     { 
#  if defined(_MSC_VER) 
      LARGE_INTEGER now; 
      LARGE_INTEGER freq; 

      QueryPerformanceCounter(&now); 
      QueryPerformanceFrequency(&freq); 

      return (now.QuadPart - m_depart.QuadPart)/static_cast<float>(freq.QuadPart); 
#  else 
      timeval now; 
      gettimeofday(&now, 0); 

      return now.tv_sec - m_depart.tv_sec + (now.tv_usec - m_depart.tv_usec)/1000000.0f; 
#  endif 
     }; 
    }; 
} 
संबंधित मुद्दे