2012-05-04 12 views
20

मैंने प्रति सेकंड घड़ी की वास्तविक संख्या अनुमानित करने के लिए इस छोटे सी ++ प्रोग्राम को अभी लिखा है।क्यों CLOCKS_PER_SEC प्रति सेकंड घड़ियों की वास्तविक संख्या क्यों है?

#include <iostream> 
#include <time.h> 

using namespace std; 

int main() { 

    for(int i = 0; i < 10 ; i++) { 

     int first_clock = clock(); 
     int first_time = time(NULL); 

     while(time(NULL) <= first_time) {} 

     int second_time = time(NULL); 
     int second_clock = clock(); 

     cout << "Actual clocks per second = " << (second_clock - first_clock)/(second_time - first_time) << "\n"; 

     cout << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << "\n"; 

    } 

    return 0; 

} 

जब मैं प्रोग्राम चलाता हूं, तो मुझे ऐसा लगता है जो आउटपुट मिलता है।

Actual clocks per second = 199139 
CLOCKS_PER_SEC = 1000000 
Actual clocks per second = 638164 
CLOCKS_PER_SEC = 1000000 
Actual clocks per second = 610735 
CLOCKS_PER_SEC = 1000000 
Actual clocks per second = 614835 
CLOCKS_PER_SEC = 1000000 
Actual clocks per second = 642327 
CLOCKS_PER_SEC = 1000000 
Actual clocks per second = 562068 
CLOCKS_PER_SEC = 1000000 
Actual clocks per second = 605767 
CLOCKS_PER_SEC = 1000000 
Actual clocks per second = 619543 
CLOCKS_PER_SEC = 1000000 
Actual clocks per second = 650243 
CLOCKS_PER_SEC = 1000000 
Actual clocks per second = 639128 
CLOCKS_PER_SEC = 1000000 

CLOCKS_PER_SEC के साथ प्रति सेकंड मैच की घड़ी की वास्तविक संख्या क्यों नहीं है? वे लगभग बराबर नहीं हैं। यहाँ क्या चल रहा है?

+3

ध्यान दें कि आप एक सेकंड से भी कम समय के लिए पाश कर सकते हैं। यदि आप 'समय' कहते हैं, और अगले सेकंड के लिए 200ms शेष हैं, तो आप ~ 200ms लूप करेंगे। वैसे भी, यह शायद मुख्य समस्या नहीं है। – mfontanini

+0

ठीक है, मुझे एहसास है कि यही कारण है कि लूप का पहला पुनरावृत्ति बाद के पुनरावृत्तियों की तुलना में एक छोटा परिणाम देता है। लेकिन मेरा सवाल बाद के पुनरावृत्तियों के बारे में है। मुझे लगता है कि मुझे यह स्पष्ट करना चाहिए था। –

+0

अब भी आप प्रत्येक बाद के पुनरावृत्ति में अपने कोउट का ओवरहेड प्राप्त करते हैं। जब तक आप अपना माप शुरू करने से पहले एक सेकंड की शुरुआत में हों, तब तक प्रतीक्षा करें। – David

उत्तर

24

clock आपके कार्यक्रम में बिताए गए समय की राशि देता है। प्रति सेकंड कुल 1,00012 घड़ी टिक हैं *। ऐसा प्रतीत होता है कि आपके कार्यक्रम ने उनमें से 60% उपभोग किया था।

कुछ और अन्य 40% का उपयोग किया।

* ठीक है, देखते हैं लगभग 1,000,000 घड़ी प्रति सेकंड टिक्स। वास्तविक संख्या सामान्यीकृत है इसलिए आपका प्रोग्राम 1,000,000 टिकों को समझता है।

17

clock(3) का आदमी पृष्ठ से:

POSIX कि CLOCKS_PER_SEC वास्तविक संकल्प के 1000000 स्वतंत्र बराबर होती है की आवश्यकता है।

आपका कार्यान्वयन कम से कम उस सम्मान में POSIX का पालन करना प्रतीत होता है।

यहाँ अपने कार्यक्रम चल रहा है, मैं एक व्यस्त मशीन पर एक निष्क्रिय मशीन पर

Actual clocks per second = 980000 
CLOCKS_PER_SEC = 1000000 
Actual clocks per second = 1000000 
CLOCKS_PER_SEC = 1000000 
Actual clocks per second = 990000 
CLOCKS_PER_SEC = 1000000 
Actual clocks per second = 1000000 
CLOCKS_PER_SEC = 1000000 
Actual clocks per second = 1000000 
CLOCKS_PER_SEC = 1000000 
Actual clocks per second = 1000000 
CLOCKS_PER_SEC = 1000000 
Actual clocks per second = 1000000 
CLOCKS_PER_SEC = 1000000 
Actual clocks per second = 1000000 
CLOCKS_PER_SEC = 1000000 
Actual clocks per second = 1000000 
CLOCKS_PER_SEC = 1000000 
Actual clocks per second = 1000000 
CLOCKS_PER_SEC = 1000000 

या इसी तरह के उत्पादन, और जैसे

Actual clocks per second = 50000 
CLOCKS_PER_SEC = 1000000 
Actual clocks per second = 600000 
CLOCKS_PER_SEC = 1000000 
Actual clocks per second = 530000 
CLOCKS_PER_SEC = 1000000 
Actual clocks per second = 580000 
CLOCKS_PER_SEC = 1000000 
Actual clocks per second = 730000 
CLOCKS_PER_SEC = 1000000 
Actual clocks per second = 730000 
CLOCKS_PER_SEC = 1000000 
Actual clocks per second = 600000 
CLOCKS_PER_SEC = 1000000 
Actual clocks per second = 560000 
CLOCKS_PER_SEC = 1000000 
Actual clocks per second = 600000 
CLOCKS_PER_SEC = 1000000 
Actual clocks per second = 620000 
CLOCKS_PER_SEC = 1000000 

उत्पादन मिलता है। चूंकि clock() आपके प्रोग्राम में खर्च किए गए (अनुमानित) समय को मापता है, ऐसा लगता है कि आपने एक व्यस्त मशीन पर परीक्षण किया है, और आपके प्रोग्राम को केवल 60% CPU समय मिला है।

+5

हालांकि यह तकनीकी रूप से सच है, क्योंकि सिस्टम कॉल वह उपयोग कर रहा है, यह भी सम्मान करता है कि यह बेकार है। – Joshua

-2

वेल डुह। आप नहीं जानते कि वर्तमान सेकंड में आप कितना दूर समय शुरू करते हैं, है ना? तो आप 1 से CLOCKS_PER_SEC से कोई परिणाम प्राप्त कर सकते हैं। अपने भीतर के पाश में इस प्रयास करें:

int first_time = time(NULL); 
// Wait for timer to roll over before starting clock! 
while(time(NULL) <= first_time) {} 

int first_clock = clock(); 
first_time = time(NULL); 
while(time(NULL) <= first_time) {} 

int second_time = time(NULL); 
int second_clock = clock(); 

cout << "Actual clocks per second = " << (second_clock - first_clock)/(second_time - first_time) << "\n"; 

cout << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << "\n"; 

पूर्ण स्रोत कोड के लिए ideone देखें। यह प्रति सेकंड वास्तविक घड़ियों को 1000000 के रूप में रिपोर्ट करता है, जैसा कि आप उम्मीद करेंगे। (मैं, 2 को पुनरावृत्तियों की संख्या को कम करने के लिए इतना है कि ideone टाइम आउट नहीं किया था।)

+1

यह केवल बताता है कि पहला परिणाम गलत क्यों है; यह अन्य नौ पर कोई असर नहीं है। (जब तक कि I/O किसी अजीब कारण के लिए एक सेकंड का पूरा तीसरा हिस्सा नहीं लेता) – Hurkyl

+1

@ हर्किल: जो भी कारण है, यह स्पष्ट है कि दो 'cout' कथन निष्पादित करने के लिए एक सेकंड का लगभग एक तिहाई ले रहे हैं। अगर आप मुझ पर विश्वास नहीं करते हैं, तो मेरा संस्करण आज़माएं। – TonyK

+1

यह * स्पष्ट * नहीं है - यह सिर्फ एक संभावना है। दूसरी बड़ी संभावना यह है कि विसंगति 'घड़ी' के कारण होती है जो दीवार घड़ी के समय को मापती नहीं है। अगली सबसे अधिक संभावना, आईएमओ, 'घड़ी' और/या 'समय' पर कम संकल्प है। – Hurkyl

2
  1. POSIX में CLOCKS_PER_SECOND को 1000000 है
  2. CLOCKS_PER_SECOND एक निरंतर बराबर है की संख्या दिखाने की अपेक्षा नहीं कर रहा है अपनी प्रक्रिया में घड़ी। यह एक संकल्प संख्या है जिसे आप घंटों की संख्या को समय की मात्रा में बदलने के लिए उपयोग कर सकते हैं।अगर आप की गणना (घड़ी() फ़ंक्शन के लिए आदमी पृष्ठ देखें)

उदाहरण के लिए: CLOCKS_PER_SEC

(second_clock-first_clock)/आप पहले और दूसरे कॉल करने के लिए "घड़ी के बीच कुल समय मिल जाएगा()" समारोह।

1

C99 मानक

केवल एक चीज C99 N1256 standard draft कहते हैं के बारे में CLOCKS_PER_SEC है कि:

CLOCKS_PER_SEC किस प्रकार clock_t (नीचे वर्णित) के साथ एक अभिव्यक्ति के लिए विस्तारित है कि प्रति सेकंड संख्या घड़ी समारोह द्वारा लौटाए गए मान का

ओथ के रूप में आरएस का जिक्र है, पीओएसआईक्स इसे 1 मिलियन तक सेट करता है, जो इसकी सटीकता को 1 माइक्रोसॉन्ड तक सीमित करता है। मुझे लगता है कि यह उन दिनों से सिर्फ एक ऐतिहासिक मूल्य है जहां अधिकतम सीपीयू आवृत्तियों को मेगा हर्टज़ में मापा गया था।

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