Bagaimana saya bisa mengukur waktu CPU dan jam dinding waktu di kedua Linux/Windows?

Maksud saya: bagaimana saya bisa mengukur waktu CPU saya dihabiskan untuk fungsi eksekusi dan jam dinding waktu yang dibutuhkan untuk menjalankan fungsi saya? (Im tertarik pada Linux/Windows dan kedua x86 dan x86_64). Melihat apa yang ingin saya lakukan (Im menggunakan C++ di sini tapi aku lebih suka C larutan):

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";

Pertanyaan lain yang penting: ini adalah jenis dari waktu pengukuran arsitektur independen atau tidak?

Mengomentari pertanyaan (8)
Larutan

Berikut ini's copy-paste solusi yang bekerja pada Windows dan Linux serta C dan C++.

Seperti yang disebutkan di komentar, ada's dorongan perpustakaan yang melakukan hal ini. Tapi jika anda dapat't menggunakan boost, ini harus bekerja:


//  Windows
#ifdef _WIN32
#include 
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 
Komentar (10)

C++11. Jauh lebih mudah untuk menulis!

Gunakan std::chrono::system_clock untuk jam dinding dan std::jam untuk cpu clock http://en.cppreference.com/w/cpp/chrono/system_clock


#include 
#include 
#include 

.... 

std::clock_t startcputime = std::clock();
do_some_fancy_stuff();
double cpu_duration = (std::clock() - startcputime) / (double)CLOCKS_PER_SEC;
std::cout 
Komentar (2)

Untuk memberikan contoh konkret dari @lip's saran untuk menggunakan boost::timer jika anda bisa (diuji dengan Meningkatkan 1.51):


#include 

// this is wallclock AND cpu time
boost::timer::cpu_timer timer;

... run some computation ...

boost::timer::cpu_times elapsed = timer.elapsed();
std::cout 
Komentar (4)

Menggunakan jam metode dalam waktu.h:

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

Sayangnya, metode ini kembali waktu CPU pada Linux, tapi kembali dinding-waktu jam pada Windows (terima kasih untuk komentator untuk informasi ini).

Komentar (8)