Cara menggunakan jam () di C ++

127

Bagaimana saya sebut clock()di C++?

Sebagai contoh, saya ingin menguji berapa banyak waktu yang dibutuhkan untuk pencarian linear untuk menemukan elemen yang diberikan dalam array.

dato datuashvili
sumber
1
Perhatikan bahwa waktu jam dinding tidak selalu merupakan cara yang baik untuk menentukan waktu microbenchmark. Untuk mendapatkan hasil yang konsisten, Anda harus bekerja di sekitar penskalaan frekuensi CPU (termasuk Intel turbo atau AMD yang setara, yang memungkinkan jam CPU Anda lebih tinggi ketika batas termal / daya memungkinkan). Profiling dengan penghitung kinerja dapat memberi Anda pengukuran dalam siklus clock inti (dan juga detail tentang apakah bottleneck adalah cache tidak ada vs. instruksi throughput vs. latency, dengan melihat penghitung selain hanya siklus). Di Linux,perf stat -d ./a.out
Peter Cordes

Jawaban:

207
#include <iostream>
#include <cstdio>
#include <ctime>

int main() {
    std::clock_t start;
    double duration;

    start = std::clock();

    /* Your algorithm here */

    duration = ( std::clock() - start ) / (double) CLOCKS_PER_SEC;

    std::cout<<"printf: "<< duration <<'\n';
}
Dolph
sumber
5
Dari apa yang saya lihat di sini cplusplus.com/reference/ctime/clock , Anda tidak perlu menggunakan notasi "std ::". Cukup gunakan "clock ()"
gromit190
4
@Birger: Dalam semua proyek saya bekerja namun gaya kode memerlukan std :: sebelum setiap std :: panggilan.
Th. Thielemann
2
Apakah ini mengembalikan jawaban dalam hitungan detik?
Arnav Borborah
1
@ArnavBorborah Ya, benar.
QuantumHoneybees
1
@ Th.Thielemann keduanya clock()dan clock_tberasal dari tajuk C Standard Library time.h, dan karenanya tidak perlu menggunakan stdawalan namespace setelah dimasukkannya pustaka mereka. <ctime>membungkus nilai dan fungsi itu dengan stdnamespace, tetapi itu tidak diharuskan untuk digunakan. Periksa di sini untuk detail implementasi: en.cppreference.com/w/cpp/header/ctime
kayleeFrye_onDeck
70

Solusi alternatif, yang portabel dan dengan presisi lebih tinggi, tersedia sejak C ++ 11, adalah untuk digunakan std::chrono.

Berikut ini sebuah contoh:

#include <iostream>
#include <chrono>
typedef std::chrono::high_resolution_clock Clock;

int main()
{
    auto t1 = Clock::now();
    auto t2 = Clock::now();
    std::cout << "Delta t2-t1: " 
              << std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count()
              << " nanoseconds" << std::endl;
}

Menjalankan ini di ideone.com memberi saya:

Delta t2-t1: 282 nanoseconds
Martin G
sumber
11
Jika Anda menyarankan untuk menggunakan C ++ 11, Anda bisa menulis using Clock=std::chrono::high_resolution_clock;. Lihat jenis alias .
JHBonarius
std::chrono::high_resolution_clockbukan monoton di semua implementasi STD lib. Dari cppreference - Umumnya kita hanya perlu menggunakan std :: chrono :: stable_clock atau std :: chrono :: system_clock secara langsung alih-alih std :: chrono :: high_resolution_clock: gunakan stable_clock untuk pengukuran durasi, dan system_clock untuk waktu jam dinding.
Kristianmitk
30

clock()mengembalikan jumlah tick tick sejak program Anda dimulai. Ada konstanta terkait CLOCKS_PER_SEC,, yang memberi tahu Anda berapa banyak kutu jam terjadi dalam satu detik. Dengan demikian, Anda dapat menguji operasi apa pun seperti ini:

clock_t startTime = clock();
doSomeOperation();
clock_t endTime = clock();
clock_t clockTicksTaken = endTime - startTime;
double timeInSeconds = clockTicksTaken / (double) CLOCKS_PER_SEC;
Shirik
sumber
6
timeInSecondsselalu datang 0.000000untukku. Bagaimana saya memperbaikinya?
noufal
3
@noufal Mungkin waktu yang dihabiskan sangat singkat sehingga muncul sebagai 0. Anda bisa mencoba menggunakan long doubleuntuk mendapatkan lebih presisi.
Gerard
mungkin resolusi jam Anda tidak cukup tinggi, jadi tidak ada waktu yang berlalu.
Marco Freudenberger
4

Pada Windows setidaknya, satu - satunya mekanisme pengukuran yang praktis akurat adalah QueryPerformanceCounter (QPC). std :: chrono diimplementasikan menggunakannya (sejak VS2015, jika Anda menggunakannya), tetapi tidak akurat pada tingkat yang sama dengan menggunakan QueryPerformanceCounter secara langsung. Secara khusus klaim untuk melaporkan granularity 1 nanosecond sama sekali tidak benar. Jadi, jika Anda mengukur sesuatu yang membutuhkan waktu yang sangat singkat (dan kasing Anda mungkin merupakan kasing), maka Anda harus menggunakan QPC, atau yang setara untuk OS Anda. Saya menemukan ini saat mengukur latensi cache, dan saya mencatat beberapa catatan yang mungkin berguna bagi Anda, di sini; https://github.com/jarlostensen/notesandcomments/blob/master/stdchronovsqcp.md

SonarJetLens
sumber
0
#include <iostream>
#include <ctime>
#include <cstdlib> //_sleep()  --- just a function that waits a certain amount of milliseconds

using namespace std;

int main()
{

    clock_t cl;     //initializing a clock type

    cl = clock();   //starting time of clock

    _sleep(5167);   //insert code here

    cl = clock() - cl;  //end point of clock

    _sleep(1000);   //testing to see if it actually stops at the end point

    cout << cl/(double)CLOCKS_PER_SEC << endl;  //prints the determined ticks per second (seconds passed)


    return 0;
}

//outputs "5.17"
Garrett
sumber
Ini tidak menambah pertanyaan yang sudah dijawab. Tidur setelah cl = jam () - cl tidak diperlukan. Dan cout mencetak detik bukan kutu per detik. cl menyimpan kutu jam.
Dr Yunke
0

Mungkin Anda mungkin tertarik pada timer seperti ini: H: M: S. Msec.

kode dalam OS Linux:

#include <iostream>
#include <unistd.h>

using namespace std;
void newline(); 

int main() {

int msec = 0;
int sec = 0;
int min = 0;
int hr = 0;


//cout << "Press any key to start:";
//char start = _gtech();

for (;;)
{
        newline();
                if(msec == 1000)
                {
                        ++sec;
                        msec = 0;
                }
                if(sec == 60)
                {
                        ++min;
                        sec = 0; 
                }
                if(min == 60)
                {
                        ++hr;
                        min = 0;
                }
        cout << hr << " : " << min << " : " << sec << " . " << msec << endl;
        ++msec;
        usleep(100000); 

}

    return 0;
}

void newline()
{
        cout << "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
}
Färid Alijani
sumber
Anda mungkin ingin memeriksa kondisi pertama ... 10 msec = 1 dtk?
Dr Yunke
2
Ini akan mengakumulasi kesalahan relatif dalam waktu karena Anda tidak menyertakan waktu yang diperlukan untuk mencetak, dan usleeptidak akan selalu kembali setelah persis jumlah yang Anda minta. Terkadang akan lebih lama. Anda harus memeriksa waktu saat ini di awal, kemudian memeriksa waktu saat ini dan kurangi untuk mendapatkan waktu absolut sejak Anda mulai setiap kali melalui loop.
Peter Cordes
0

Anda dapat mengukur berapa lama program Anda bekerja. Fungsi-fungsi berikut membantu mengukur waktu CPU sejak awal program:

  • C ++ (double) clock () / CLOCKS PER SEC dengan ctime disertakan.
  • python time.clock () mengembalikan nilai floating-point dalam hitungan detik.
  • Java System.nanoTime () mengembalikan nilai panjang dalam nanoseconds.

referensi saya : Algoritma toolbox minggu 1 kursus bagian dari struktur data dan algoritma spesialisasi oleh University of California San Diego & National Research University Higher School of Economics

sehingga Anda dapat menambahkan baris kode ini setelah algoritme Anda

cout << (double)clock() / CLOCKS_PER_SEC ;

Output yang Diharapkan: output yang mewakili jumlah clock ticks per second

Muhamed Youssry
sumber
1
Pertanyaannya adalah tanyakan hanya untuk c ++. Jadi itu bagus Anda merujuk ke bahasa pemrograman lain / skrip, tetapi itu keluar dari topik.
dboy