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.
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.
Jawaban:
#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';
}
clock()
dan clock_t
berasal dari tajuk C Standard Library time.h
, dan karenanya tidak perlu menggunakan std
awalan namespace setelah dimasukkannya pustaka mereka. <ctime>
membungkus nilai dan fungsi itu dengan std
namespace, tetapi itu tidak diharuskan untuk digunakan. Periksa di sini untuk detail implementasi: en.cppreference.com/w/cpp/header/ctime
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
using Clock=std::chrono::high_resolution_clock;
. Lihat jenis alias .
std::chrono::high_resolution_clock
bukan 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.
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;
timeInSeconds
selalu datang 0.000000
untukku. Bagaimana saya memperbaikinya?
long double
untuk mendapatkan lebih presisi.
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
#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"
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";
}
usleep
tidak 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.
Anda dapat mengukur berapa lama program Anda bekerja. Fungsi-fungsi berikut membantu mengukur waktu CPU sejak awal program:
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
perf stat -d ./a.out