2010-07-10 17 views
101

में घड़ी() का उपयोग कैसे करें C++ में मैं कैसे कॉल करूं?सी ++

उदाहरण के लिए, मैं परीक्षण करना चाहता हूं कि एक सरणी में दिए गए तत्व को खोजने के लिए एक रैखिक खोज कितनी बार लेती है।

+0

ध्यान दें कि दीवार घड़ी का समय हमेशा माइक्रोबेंचमार्क के लिए एक अच्छा तरीका नहीं है। लगातार परिणाम प्राप्त करने के लिए, आपको सीपीयू फ्रीक्वेंसी-स्केलिंग (इंटेल [टर्बो] (https://en.wikipedia.org/wiki/Intel_Turbo_Boost) या एएमडी समकक्ष समेत काम करना होगा, जो आपके सीपीयू घड़ी को थर्मल/पावर पर उच्चतम बनाता है सीमा अनुमति)। प्रदर्शन काउंटर के साथ प्रोफाइलिंग आपको कोर घड़ी चक्रों में माप प्रदान कर सकती है (और बाधाओं के बारे में भी जानकारी है कि कैश मिस बनाम निर्देश थ्रूपुट बनाम विलंबता है, केवल चक्रों के अलावा काउंटरों को देखकर)। लिनक्स पर, 'perf stat -d।/A.out' –

उत्तर

167
#include <iostream> 
#include <cstdio> 
#include <ctime> 

int main() { 
    std::clock_t start; 
    double duration; 

    start = std::clock(); 

    /* Your algorithm here */ 

    duration = (std::clock() - start)/(double) CLOCKS_PER_SEC; 

    std::cout<<"printf: "<< duration <<'\n'; 
} 
+2

मैं यहां क्या देख सकता हूं http://www.cplusplus.com/reference/ctime/clock/, आपको "std ::" नोटेशन का उपयोग करने की आवश्यकता नहीं है। बस "घड़ी()" – gromit190

+1

@ बिरगर का उपयोग करें: मैंने अभी तक काम किया है, सभी परियोजनाओं में कोड शैली को प्रत्येक std :: कॉल से पहले std :: की आवश्यकता होती है। –

+1

क्या यह सेकंड में जवाब देता है? –

27

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

clock_t startTime = clock(); 
doSomeOperation(); 
clock_t endTime = clock(); 
clock_t clockTicksTaken = endTime - startTime; 
double timeInSeconds = clockTicksTaken/(double) CLOCKS_PER_SEC; 
+6

' timeInSeconds' हमेशा मेरे लिए '0.000000' आ रहा है। मैं इसे कैसे ठीक करूं? – noufal

+3

@noufal शायद बिताए गए समय इतने छोटे हैं कि यह 0 के रूप में दिखाई देता है। आप अधिक सटीकता प्राप्त करने के लिए 'लंबे डबल' का उपयोग करने का प्रयास कर सकते हैं। – Gerard

0
#include <iostream> 
#include <ctime> 
#include <cstdlib> //_sleep() --- just a function that waits a certain amount of milliseconds 

using namespace std; 

int main() 
{ 

    clock_t cl;  //initializing a clock type 

    cl = clock(); //starting time of clock 

    _sleep(5167); //insert code here 

    cl = clock() - cl; //end point of clock 

    _sleep(1000); //testing to see if it actually stops at the end point 

    cout << cl/(double)CLOCKS_PER_SEC << endl; //prints the determined ticks per second (seconds passed) 


    return 0; 
} 

//outputs "5.17" 
+0

यह पहले से ही उत्तर दिए गए प्रश्न में शामिल नहीं है। सीएल = घड़ी() के बाद सो जाओ - सीएल की आवश्यकता नहीं है। और cout प्रति सेकेंड ticks सेकंड प्रिंट करता है। सीएल घड़ी की टिकटें स्टोर करता है। –

48

एक वैकल्पिक समाधान है, जो पोर्टेबल और उच्च परिशुद्धता के साथ है, उपलब्ध के बाद से सी ++ 11, std::chrono उपयोग करने के लिए है: इस प्रकार, आप इस तरह किसी भी आपरेशन परीक्षण कर सकते हैं। मुझे दिया

#include <iostream> 
#include <chrono> 
typedef std::chrono::high_resolution_clock Clock; 

int main() 
{ 
    auto t1 = Clock::now(); 
    auto t2 = Clock::now(); 
    std::cout << "Delta t2-t1: " 
       << std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count() 
       << " nanoseconds" << std::endl; 
} 

ideone.com पर इस चल रहा है::

Delta t2-t1: 282 nanoseconds 
+3

यदि आप सी ++ 11 का उपयोग करने का सुझाव दे रहे हैं, तो आप क्लॉक = std :: chrono :: high_resolution_clock; 'का उपयोग करके लिख सकते हैं। [टाइप उपनाम] देखें (http://en.cppreference.com/w/cpp/language/type_alias)। – JHBonarius

+0

पूरी तरह से उस – Martin

0

शायद आप इस तरह घड़ी में रुचि हो सकती: एच: एम: एस

यहाँ एक उदाहरण है। Msec।

लिनक्स ओएस में कोड:

#include <iostream> 
#include <unistd.h> 

using namespace std; 
void newline(); 

int main() { 

int msec = 0; 
int sec = 0; 
int min = 0; 
int hr = 0; 


//cout << "Press any key to start:"; 
//char start = _gtech(); 

for (;;) 
{ 
     newline(); 
       if(msec == 1000) 
       { 
         ++sec; 
         msec = 0; 
       } 
       if(sec == 60) 
       { 
         ++min; 
         sec = 0; 
       } 
       if(min == 60) 
       { 
         ++hr; 
         min = 0; 
       } 
     cout << hr << " : " << min << " : " << sec << " . " << msec << endl; 
     ++msec; 
     usleep(100000); 

} 

    return 0; 
} 

void newline() 
{ 
     cout << "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"; 
} 
+0

से सहमत हैं आप पहली शर्त की जांच कर सकते हैं ... 10 msec = 1 सेकंड? –

+0

क्षमा करें दोस्त, आप सही थे! –

+1

यह उस समय सापेक्ष त्रुटि जमा करेगा क्योंकि इसमें प्रिंट करने में लगने वाला समय शामिल नहीं है, और 'usleep' हमेशा आपके द्वारा पूछे जाने वाले राशि के बाद वापस नहीं आ जाएगा। कभी-कभी यह लंबा होगा। आपको शुरुआत में वर्तमान समय की जांच करनी चाहिए, फिर वर्तमान समय की जांच करें और पूर्ण समय प्राप्त करने के लिए घटाएं क्योंकि आपने लूप के माध्यम से हर बार शुरू किया था। –

1
कम से कम

Windows पर, केवल व्यावहारिक रूप से सही माप तंत्र QueryPerformanceCounter (QPC) है। std :: chrono इसका उपयोग करके कार्यान्वित किया जाता है (VS2015 के बाद से, यदि आप इसका उपयोग करते हैं), लेकिन यह सीधे QueryPerformanceCounter का उपयोग करने के समान डिग्री के लिए सटीक है। विशेष रूप से 1 नैनोसेकंद ग्रैन्युलरिटी पर रिपोर्ट करने का दावा बिल्कुल सही नहीं है। इसलिए, यदि आप कुछ ऐसा माप रहे हैं जो बहुत कम समय लेता है (और आपका मामला ऐसा ही मामला हो सकता है), तो आपको क्यूपीसी, या अपने ओएस के समकक्ष का उपयोग करना चाहिए। कैश विलंबता को मापते समय मैं इसके खिलाफ आया, और मैंने कुछ नोट्स को झटका दिया जो आपको उपयोगी लग सकते हैं; https://github.com/jarlostensen/notesandcomments/blob/master/stdchronovsqcp.md