तो मेरे लिए सटीक समय महत्वपूर्ण है, और मैं सी ++ 11 में निर्दिष्ट 3 प्रकार के घड़ियों की जांच कर रहा था, अर्थात् system_clock
, steady_clock
, और high_resolution_clock
। मेरी प्रारंभिक चिंता परीक्षण कर रही थी अगर विभिन्न प्रकार के घड़ियों पर कॉल ओवरहेड में कोई अंतर होता है, और प्रत्येक प्रकार की घड़ी के समाधान की जांच करने के लिए।सी ++ 11 घड़ियां: g ++ steady_clock :: is_steady == झूठी?
#include <chrono>
#include <cstdio>
using namespace std;
using namespace std::chrono;
int main(int argc, char **argv)
{
size_t N = 1e6;
if(2 == argc) {
sscanf(argv[1], "%zu", &N);
}
#if defined(hrc)
typedef high_resolution_clock clock;
#warning "High resolution clock"
#elif defined(sc)
typedef steady_clock clock;
#warning "Steady clock"
#elif defined(sys)
typedef system_clock clock;
#warning "System clock"
#endif
const double resolution = double(clock::period::num)/double(clock::period::den);
printf("clock::period: %lf us.\n", resolution*1e6);
printf("clock::is_steady: %s\n", clock::is_steady ? "yes" : "no");
printf("Calling clock::now() %zu times...\n", N);
// first, warm up
for(size_t i=0; i<100; ++i) {
time_point<clock> t = clock::now();
}
// loop N times
time_point<clock> start = clock::now();
for(size_t i=0; i<N; ++i) {
time_point<clock> t = clock::now();
}
time_point<clock> end = clock::now();
// display duration
duration<double> time_span = duration_cast<duration<double>>(end-start);
const double sec = time_span.count();
const double ns_it = sec*1e9/N;
printf("That took %lf seconds. That's %lf ns/iteration.\n", sec, ns_it);
return 0;
}
मैं साथ
$ g++-4.7 -std=c++11 -Dhrc chrono.cpp -o hrc_chrono
chrono.cpp:15:2: warning: #warning "High resolution clock" [-Wcpp]
$ g++-4.7 -std=c++11 -Dsys chrono.cpp -o sys_chrono
chrono.cpp:15:2: warning: #warning "System clock" [-Wcpp]
$ g++-4.7 -std=c++11 -Dsc chrono.cpp -o sc_chrono
chrono.cpp:15:2: warning: #warning "Steady clock" [-Wcpp]
मैं जी ++ 4.7.2 के साथ संकलित यह संकलन, और
- SUSE लाइनेक्स, कर्नेल v3.1.10 पर भाग गया: यहाँ मेरी नमूना कार्यक्रम है , सीपीयू i7
- एंगस्ट्रॉम लिनक्स एम्बेडेड सिस्टम, कर्नेल v3.1.10, एमसीयू टेग्रा 2 (एआरएम कॉर्टेक्स ए 9)।
पहली आश्चर्यजनक बात यह थी कि 3 प्रकार की घड़ी स्पष्ट रूप से समानार्थी हैं। उनके पास एक ही अवधि (1 माइक्रो सेकंड) है, और समय/कॉल व्यावहारिक रूप से वही है। 3 प्रकार के घड़ियों को निर्दिष्ट करने का क्या मतलब है यदि वे सभी समान हैं? क्या यह सिर्फ इसलिए है क्योंकि chrono
का G ++ कार्यान्वयन अभी तक परिपक्व नहीं है? या शायद 3.1.10 कर्नेल में केवल एक उपयोगकर्ता-सुलभ घड़ी है?
दूसरा आश्चर्य, और यह बहुत बड़ा है, steady_clock :: is_steady == false है। मैं काफी हद तक निश्चित हूं कि परिभाषा के अनुसार, वह संपत्ति सच होनी चाहिए। क्या देता है?? मैं इसके आसपास कैसे काम कर सकता हूं (यानी, एक स्थिर घड़ी प्राप्त करें)?
यदि आप अन्य प्लेटफ़ॉर्म/कंपाइलर्स पर सरल प्रोग्राम चला सकते हैं, तो मुझे परिणाम जानने में बहुत दिलचस्पी होगी। किसी को भी सोच रहा है, तो यह मेरे कोर i7 पर लगभग 25 एनएस/यात्रा है, और 1000 एनएस/Tegra 2.
उम्म, हाँ। मैं प्रत्येक बार घड़ी के लिए कोड को 3 बार संकलित कर रहा हूं, जिसे '-DXXX' ध्वज द्वारा निर्दिष्ट किया गया है। 'G ++ 'का अंतिम तर्क केवल निष्पादन योग्य फ़ाइल नाम है, जो किसी चाटना से कोई फर्क नहीं पड़ता। (हालांकि मैंने यह देखा है कि किस प्रकार की घड़ी और तथ्य यह है कि कार्यक्रम क्रोनो लाइब्रेरी का उपयोग कर रहा है।) –
क्षमा करें, मैं कमांड लाइन –