दिलचस्प पोस्ट
मोंगो डीबी: एक से कई संग्रहों से डेटा एकत्र करें..कैसे? java.lang.StackOverFlow त्रुटि संदिग्ध कई विचार हैं? जांच करें कि छवि दूरस्थ URL पर मौजूद है या नहीं कैसे जावा प्रोग्राम मुख्य विधि को परिभाषित किए बिना चलाते हैं? क्या मैं अपने एएसपी.नेट एमवीसी व्यू के लिए एक गुमनाम प्रकार पारित कर सकता हूं? क्या भाई नोड्स का चयन करने का कोई तरीका है? प्रत्येक के बीच क्या अलग है और रूबी में विधि एकत्र करें jquery के साथ HTML स्ट्रिंग पार्स करें क्या किसी निर्माता के टेम्पलेट पैरामीटर को स्पष्ट रूप से निर्दिष्ट किया जा सकता है? एक jQuery AJAX GET कॉल में अनुरोध हेडर पास करें IPhone ओएस में प्रदर्शन बंद करें (आईओएस) विशिष्ट वस्तुओं के लिए LINQ के साथ काम नहीं कर रहा है पायथन: प्रिंट कमांड के साथ नई लाइन से बचें क्लासपाथ से फाइल इंस्टेंस के रूप में लोड करने / संदर्भ कैसे करें सी # से बाइट से IntPtr कैसे प्राप्त करें

मैं CPU समय और दीवार घड़ी समय दोनों Linux / Windows पर कैसे माप सकता हूँ?

मेरा मतलब है: मैं अपना फ़ंक्शन चलाने के लिए फ़ंक्शन निष्पादन और दीवार घड़ी समय पर अपना सीपीयू कैसे माप सकता हूँ? (लिनक्स / विंडोज में और दोनों x86 और x86_64 में दिलचस्पी है) देखें कि मैं क्या करना चाहता हूं (सी का उपयोग कर सी ++ यहाँ पर मैं सी समाधान पसंद करूंगा):

int startcputime, endcputime, wcts, wcte; startcputime = cputime(); function(args); endcputime = cputime(); std::cout << "it took " << endcputime - startcputime << " s of CPU to execute this\n"; wcts = wallclocktime(); function(args); wcte = wallclocktime(); std::cout << "it took " << wcte - wcts << " s of real time to execute this\n"; 

एक और महत्वपूर्ण सवाल: क्या इस प्रकार का समय मापने वाला वास्तु स्वतंत्र है या नहीं?

वेब के समाधान से एकत्रित समाधान "मैं CPU समय और दीवार घड़ी समय दोनों Linux / Windows पर कैसे माप सकता हूँ?"

यहां एक कॉपी-पेस्ट समाधान है जो विंडोज और लिनक्स दोनों के साथ-साथ सी और सी ++ पर काम करता है।

जैसा कि टिप्पणियों में उल्लिखित है, इसमें एक बढ़ावा पुस्तकालय है जो यह करता है। लेकिन यदि आप बढ़ावा नहीं कर सकते, तो यह काम करना चाहिए:

 // Windows #ifdef _WIN32 #include <Windows.h> double get_wall_time(){ LARGE_INTEGER time,freq; if (!QueryPerformanceFrequency(&freq)){ // Handle error return 0; } if (!QueryPerformanceCounter(&time)){ // Handle error return 0; } return (double)time.QuadPart / freq.QuadPart; } double get_cpu_time(){ FILETIME a,b,c,d; if (GetProcessTimes(GetCurrentProcess(),&a,&b,&c,&d) != 0){ // Returns total user time. // Can be tweaked to include kernel times as well. return (double)(d.dwLowDateTime | ((unsigned long long)d.dwHighDateTime << 32)) * 0.0000001; }else{ // Handle error return 0; } } // Posix/Linux #else #include <time.h> #include <sys/time.h> double get_wall_time(){ struct timeval time; if (gettimeofday(&time,NULL)){ // Handle error return 0; } return (double)time.tv_sec + (double)time.tv_usec * .000001; } double get_cpu_time(){ return (double)clock() / CLOCKS_PER_SEC; } #endif 

इन घड़ियों को कार्यान्वित करने के कई तरीके हैं लेकिन यहां बताया गया है कि ऊपर के स्निपेट का उपयोग क्या होता है:

विंडोज के लिए:

  • वाल टाइम: प्रदर्शन काउंटर
  • सीपीयू समय: GetProcessTimes() टाइम्स GetProcessTimes()

लिनक्स के लिए:

  • वाल टाइम: gettimeofday()
  • सीपीयू समय: clock()

और यहां एक छोटा प्रदर्शन है:

 #include <math.h> #include <iostream> using namespace std; int main(){ // Start Timers double wall0 = get_wall_time(); double cpu0 = get_cpu_time(); // Perform some computation. double sum = 0; #pragma omp parallel for reduction(+ : sum) for (long long i = 1; i < 10000000000; i++){ sum += log((double)i); } // Stop timers double wall1 = get_wall_time(); double cpu1 = get_cpu_time(); cout << "Wall Time = " << wall1 - wall0 << endl; cout << "CPU Time = " << cpu1 - cpu0 << endl; // Prevent Code Elimination cout << endl; cout << "Sum = " << sum << endl; } 

आउटपुट (12 धागे):

 Wall Time = 15.7586 CPU Time = 178.719 Sum = 2.20259e+011 

सी ++ 11। लिखना बहुत आसान है!

std::chrono::system_clock घड़ी के लिए std::chrono::system_clock उपयोग करें और std::chrono::system_clock std::clock लिए std::clock घड़ी http://en.cppreference.com/w/cpp/chrono/system_clock

 #include <cstdio> #include <ctime> #include <chrono> .... std::clock_t startcputime = std::clock(); do_some_fancy_stuff(); double cpu_duration = (std::clock() - startcputime) / (double)CLOCKS_PER_SEC; std::cout << "Finished in " << cpu_duration << " seconds [CPU Clock] " << std::endl; auto wcts = std::chrono::system_clock::now(); do_some_fancy_stuff(); std::chrono::duration<double> wctduration = (std::chrono::system_clock::now() - wcts); std::cout << "Finished in " << wctduration.count() << " seconds [Wall Clock]" << std::endl; 

और वोला, आसान और पोर्टेबल! #ifdef _WIN32 या LINUX के लिए कोई ज़रूरत नहीं है!

यदि आप अधिक सटीक की आवश्यकता है तो आप chrono::high_resolution_clock का भी उपयोग कर सकते हैं http://en.cppreference.com/w/cpp/chrono/high_resolution_clock

यदि आपको (बूस्ट 1.51 के साथ परीक्षण किया गया हो) boost::timer का उपयोग करने के लिए @ होंठ के सुझाव का एक ठोस उदाहरण देना

 #include <boost/timer/timer.hpp> // this is wallclock AND cpu time boost::timer::cpu_timer timer; ... run some computation ... boost::timer::cpu_times elapsed = timer.elapsed(); std::cout << " CPU TIME: " << (elapsed.user + elapsed.system) / 1e9 << " seconds" << " WALLCLOCK TIME: " << elapsed.wall / 1e9 << " seconds" << std::endl; 

clock विधि में clock विधि का उपयोग करें:

 clock_t start = clock(); /* Do stuffs */ clock_t end = clock(); float seconds = (float)(end - start) / CLOCKS_PER_SEC; 

दुर्भाग्य से, यह विधि लिनक्स पर सीपीयू समय देता है, लेकिन विंडोज पर दीवार घड़ी का समय देता है (इस जानकारी के लिए टिप्पणीकर्ताओं के लिए धन्यवाद)।