de-vraag
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
 yak
yak
Question

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?

46 2013-07-02T17:55:10+00:00 4
 yak
yak
Pertanyaan edit 2 Juli 2013 в 6:15
Pemrograman
c++
c
time
performance
cpu
Solution / Answer
 Mysticial
Mysticial
3 Juli 2013 в 5:55
2013-07-03T05:55:28+00:00
Lebih
Sumber
Sunting
#19812624

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

Ada's banyak cara untuk menerapkan jam ini. Tapi di sini's apa potongan di atas menggunakan:

Untuk Windows:

  • Waktu Dinding: Penghitung Kinerja
  • Waktu CPU: GetProcessTimes()

Untuk Linux:

  • Waktu dinding: gettimeofday()
  • Waktu CPU: jam()

Dan berikut's sebuah demonstrasi kecil:

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

}

Output (12 thread):

Wall Time = 15.7586
CPU Time  = 178.719

Sum = 2.20259e+011
 Mysticial
Mysticial
Jawaban edit 10 Juni 2015 в 12:01
62
0
 carlduke
carlduke
31 Agustus 2015 в 6:11
2015-08-31T18:11:34+00:00
Lebih
Sumber
Sunting
#19812626

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

Et voilà, mudah dan portable! Tidak perlu untuk #ifdef _WIN32 atau LINUX!

Anda bahkan bisa menggunakan chrono::high_resolution_clock jika anda membutuhkan lebih presisi http://en.cppreference.com/w/cpp/chrono/high_resolution_clock

Paweł Białaszczyk
Paweł Białaszczyk
Jawaban edit 28 Oktober 2015 в 10:38
28
0
Andre Holzner
Andre Holzner
13 Agustus 2013 в 8:46
2013-08-13T08:46:36+00:00
Lebih
Sumber
Sunting
#19812625

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

#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;
14
0
 syb0rg
syb0rg
2 Juli 2013 в 6:07
2013-07-02T18:07:11+00:00
Lebih
Sumber
Sunting
#19812623

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).

 syb0rg
syb0rg
Jawaban edit 2 Juli 2013 в 6:18
-1
0
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
Roxana Elizabeth CASTILLO Avalos
Terdaftar 4 hari yang lalu
2
Hideo Nakagawa
Terdaftar 5 hari yang lalu
3
Sergiy Tytarenko
Terdaftar 6 hari yang lalu
4
shoxrux azadov
Terdaftar 1 minggu yang lalu
5
Koreets Koreytsev
Terdaftar 1 minggu yang lalu
ID
JA
RU
© de-vraag 2022
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi