2010-06-03 10 views
36

मैंने हमेशा यह मापने के लिए घड़ी() का उपयोग किया है कि मेरे एप्लिकेशन को शुरू होने से कितना समय लगता है;सी: बहु-थ्रेडेड प्रोग्राम्स में समय मापने के लिए घड़ी() का उपयोग करके

int main(int argc, char *argv[]) { 
    const clock_t START = clock(); 

    // ... 

    const double T_ELAPSED = (double)(clock() - START)/CLOCKS_PER_SEC; 
} 

चूंकि मैंने पॉज़िक्स धागे का उपयोग करना शुरू कर दिया है, यह असफल प्रतीत होता है। ऐसा लगता है कि घड़ी() एन धागे के साथ तेजी से एन गुना बढ़ जाती है। जैसा कि मुझे नहीं पता कि कितने धागे एक साथ चल रहे हैं, यह दृष्टिकोण विफल रहता है। तो मैं कैसे माप सकता हूं कि कितना समय बीत चुका है?

+1

देखें [क्या gettimeofday() microsecond संकल्प होने की गारंटी है?] (Http://stackoverflow.com/questions/88/is-gettimeofday-guaranteed-to-be-of-microsecond-resolution) –

+0

यह उत्तर देखें एक पोर्टेबल समाधान के लिए: http://stackoverflow.com/questions/361363/how-to-measure-time-in-milliseconds-using-ansi-c/37920181#37920181 –

उत्तर

81

clock() आपकी प्रक्रिया द्वारा उपयोग किए गए CPU समय को मापने के लिए, दीवार घड़ी के समय को नहीं देखें। जब आपके पास एक साथ चलने वाले एकाधिक थ्रेड होते हैं, तो आप स्पष्ट रूप से CPU समय के माध्यम से बहुत तेजी से जला सकते हैं।

यदि आप दीवार घड़ी निष्पादन समय जानना चाहते हैं, तो आपको उचित फ़ंक्शन का उपयोग करने की आवश्यकता है। एएनएसआई सी में केवल एक ही time() है, जो आमतौर पर केवल 1 सेकंड का संकल्प होता है।

हालांकि, जैसा कि आपने कहा है कि आप POSIX का उपयोग कर रहे हैं, इसका मतलब है कि आप clock_gettime() का उपयोग कर सकते हैं, जिसे time.h में परिभाषित किया गया है। विशेष रूप से CLOCK_MONOTONIC घड़ी सबसे अच्छा इस के लिए उपयोग करने के लिए है:

struct timespec start, finish; 
double elapsed; 

clock_gettime(CLOCK_MONOTONIC, &start); 

/* ... */ 

clock_gettime(CLOCK_MONOTONIC, &finish); 

elapsed = (finish.tv_sec - start.tv_sec); 
elapsed += (finish.tv_nsec - start.tv_nsec)/1000000000.0; 

(ध्यान दें कि मैं elapsed की गणना किया है ध्यान से यह सुनिश्चित करें कि सटीक नहीं खोया है, जब बहुत ही कम अंतराल समय)।

अपने OS CLOCK_MONOTONIC (जो आप sysconf(_SC_MONOTONIC_CLOCK) साथ रनटाइम पर जांच कर सकते हैं) प्रदान नहीं करता है, तो आप CLOCK_REALTIME फ़ॉलबैक के रूप में उपयोग कर सकते हैं - लेकिन ध्यान दें उत्तरार्द्ध नुकसान यह है कि यह करता है, तो सिस्टम का समय गलत परिणाम उत्पन्न होगा है आपकी प्रक्रिया चल रही है, जबकि बदल गया है।

+1

>> पोस्ट किया गया यह सही उत्तर है एसओ पर कई भ्रामक उत्तरों के महासागर में @ कैफ द्वारा। यह रीयलटाइम सिस्टम के लिए विशेष रूप से सही है जो POSIX का समर्थन करते हैं। मैं इस उद्देश्य के लिए घड़ी, समय, gettimeofday या किसी अन्य समारोह का उपयोग नहीं करेंगे। << – Xofo

+0

'सावधानीपूर्वक' गणना करके "सावधानीपूर्वक" क्या मतलब है? क्या उन्हें एक असाइनमेंट में जोड़ने के बजाय दो अलग-अलग बयानों का उपयोग करने का कोई महत्व है? – sevko

+2

@sevko: नहीं, यह एक कथन में किया जा सकता है - जो मैं कह रहा हूं कि 'फिनिश' और 'स्टार्ट' को परिवर्तित करने के बजाए, 'नैनोसेकंड्स' दोनों हिस्सों से अलग-अलग दोनों 'सेकेंड' हिस्सों को अलग-अलग घटाना है। पहले फ़्लोटिंग पॉइंट मानों के लिए और फिर उन्हें घटाना। – caf

1

आपको किस समय के समाधान की आवश्यकता है? आप दूसरे संकल्प के लिए time.h से समय() का उपयोग कर सकते हैं। यदि आपको उच्च रिज़ॉल्यूशन की आवश्यकता है, तो आप कुछ और सिस्टम विशिष्ट का उपयोग कर सकते हैं। Timer function to provide time in nano seconds using C++

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