c++ - समय एल्गोरिदम: सी++ में घड़ी() बनाम समय()




clock timing (4)

Gettimeofday के बारे में कैसे? जब इसे कहा जाता है तो यह समय की जानकारी के साथ दो structs अद्यतन करता है। आमतौर पर, बाएं हाथ की संरचना पर्याप्त है, जो एपोक, 01-01-1970 00:00:00 (यूटीसी) के बाद से समय लेगी। इसका उपयोग निम्नानुसार किया जा सकता है:

#include <time.h>

struct timeval start;
double mtime, seconds, useconds;
gettimeofday(&start, NULL); //left hand struct is usually enough
seconds  = start.tv_sec; //time in seconds
useconds = start.tv_usec; //time in microseconds

एक एल्गोरिदम (लगभग एमएस में) के समय के लिए, इनमें से कौन सा दृष्टिकोण बेहतर है:

clock_t start = clock();
algorithm();
clock_t end = clock();
double time = (double) (end-start) / CLOCKS_PER_SEC * 1000.0;

या,

time_t start = time(0);
algorithm();
time_t end = time(0);
double time = difftime(end, start) * 1000.0;

इसके अलावा, फ्रीनोड में सी ++ चैनल में कुछ चर्चाओं से, मुझे पता है कि घड़ी का एक बहुत ही खराब संकल्प है, इसलिए समय (अपेक्षाकृत) तेज़ एल्गोरिदम के लिए शून्य होगा। लेकिन, जिसमें बेहतर रिज़ॉल्यूशन समय () या घड़ी () है? या यह वही है?


टाइम_टी संरचना शायद एक पूर्णांक होने जा रही है, जिसका अर्थ है कि इसमें दूसरा संकल्प होगा।

कोड का पहला भाग: यह केवल उस समय की गणना करेगा जब सीपीयू कुछ कर रहा था, इसलिए जब आप सोते हैं (), तो यह कुछ भी नहीं गिना जाएगा। यह आपके द्वारा सोए जाने वाले समय की गणना करके बाईपास किया जा सकता है, लेकिन यह शायद थोड़ी देर बाद बहाव करना शुरू कर देगा।

दूसरा टुकड़ा: केवल सेकेंड का संकल्प, इतना अच्छा नहीं है कि आपको उप-दूसरी बार रीडिंग की आवश्यकता है।

आपके द्वारा प्राप्त किए जा सकने वाले सर्वोत्तम रिज़ॉल्यूशन के साथ समय रीडिंग के लिए, आपको ऐसा कुछ करना चाहिए:

double getUnixTime(void)
{
    struct timespec tv;

    if(clock_gettime(CLOCK_REALTIME, &tv) != 0) return 0;

    return (tv.tv_sec + (tv.tv_nsec / 1000000000.0));
}

double start_time = getUnixTime();
double stop_time, difference;

doYourStuff();

stop_time = getUnixTime();
difference = stop_time - start_time;

अधिकांश प्रणालियों पर यह संकल्प कुछ माइक्रोसेकंड तक नीचे जाएगा, लेकिन यह विभिन्न CPUs, और शायद यहां तक ​​कि प्रमुख कर्नेल संस्करणों के साथ भिन्न हो सकता है।


यह निर्भर करता है कि आप क्या चाहते हैं: time वास्तविक समय को मापता है जबकि clock वर्तमान प्रक्रिया द्वारा प्रसंस्करण समय को मापती है। यदि आपकी प्रक्रिया किसी भी सराहनीय समय के लिए सोती है, या सिस्टम अन्य प्रक्रियाओं में व्यस्त है, तो दोनों बहुत अलग होंगे।

http://en.cppreference.com/w/cpp/chrono/c/clock


<chrono> सबसे अच्छा है। विजुअल स्टूडियो 2013 इस सुविधा प्रदान करता है। व्यक्तिगत रूप से, मैंने ऊपर वर्णित सभी विधियों का प्रयास किया है। मैं दृढ़ता से अनुशंसा करता हूं कि आप <chrono> लाइब्रेरी का उपयोग करें। यह दीवार के समय को ट्रैक कर सकता है और साथ ही साथ एक अच्छा संकल्प (एक सेकंड से भी कम) हो सकता है।







timing