Làm thế nào để gọi clock()
trong C++
?
Ví dụ: tôi muốn kiểm tra thời gian tìm kiếm tuyến tính mất bao nhiêu thời gian để tìm một phần tử đã cho trong một mảng.
Làm thế nào để gọi clock()
trong C++
?
Ví dụ: tôi muốn kiểm tra thời gian tìm kiếm tuyến tính mất bao nhiêu thời gian để tìm một phần tử đã cho trong một mảng.
Câu trả lời:
#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()
và clock_t
đều từ tiêu đề của Thư viện chuẩn C time.h
, và do đó không cần sử dụng std
tiền tố không gian tên sau khi bao gồm các thư viện của họ. <ctime>
kết thúc giá trị và chức năng đó với std
không gian tên, nhưng không bắt buộc phải sử dụng. Kiểm tra tại đây để biết chi tiết thực hiện: en.cppreference.com/w/cpp/header/ctime
Một giải pháp thay thế, có thể mang theo và có độ chính xác cao hơn, có sẵn từ C ++ 11, là sử dụng std::chrono
.
Đây là một ví dụ:
#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;
}
Chạy cái này trên ideone.com đã cho tôi:
Delta t2-t1: 282 nanoseconds
using Clock=std::chrono::high_resolution_clock;
. Xem bí danh .
std::chrono::high_resolution_clock
không đơn điệu trên tất cả các triển khai lib std. Từ cppreference - Nói chung, người ta chỉ nên sử dụng std :: chrono :: ổn định hoặc std :: chrono :: system_clock thay vì std :: chrono :: high_resolution_clock: sử dụng ổn định cho các phép đo thời lượng và system_clock cho thời gian đồng hồ treo tường.
clock()
trả về số lượng đồng hồ tích tắc kể từ khi chương trình của bạn bắt đầu. Có một hằng số liên quan, CLOCKS_PER_SEC
cho bạn biết có bao nhiêu tích tắc đồng hồ xảy ra trong một giây. Vì vậy, bạn có thể kiểm tra bất kỳ hoạt động như thế này:
clock_t startTime = clock();
doSomeOperation();
clock_t endTime = clock();
clock_t clockTicksTaken = endTime - startTime;
double timeInSeconds = clockTicksTaken / (double) CLOCKS_PER_SEC;
timeInSeconds
luôn luôn đến 0.000000
với tôi Làm thế nào tôi sẽ sửa nó?
long double
để có độ chính xác cao hơn.
Trên Windows ít nhất, cơ chế đo lường chính xác thực tế duy nhất là QueryPerformanceCorer (QPC). std :: chrono được triển khai bằng cách sử dụng nó (kể từ VS2015, nếu bạn sử dụng điều đó), nhưng nó không chính xác ở mức độ giống như sử dụng trực tiếp QueryPerformanceCorer. Cụ thể, yêu cầu báo cáo ở mức độ chi tiết 1 nano giây là hoàn toàn không chính xác. Vì vậy, nếu bạn đang đo một thứ gì đó mất một khoảng thời gian rất ngắn (và trường hợp của bạn có thể chỉ là trường hợp như vậy), thì bạn nên sử dụng QPC hoặc tương đương cho HĐH của bạn. Tôi đã đưa ra điều này khi đo độ trễ của bộ đệm và tôi đã ghi lại một số lưu ý mà bạn có thể thấy hữu ích ở đây; https://github.com/jarlostensen/notesandcomments/blob/master/std syncovsqcp.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"
Có lẽ bạn có thể quan tâm đến bộ đếm thời gian như thế này: H: M: S. Thưa bà
mã trong hệ điều hành 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
sẽ không luôn trả lại sau chính xác số tiền bạn yêu cầu. Đôi khi nó sẽ dài hơn. Bạn nên kiểm tra thời gian hiện tại khi bắt đầu, sau đó kiểm tra thời gian hiện tại và trừ đi để có thời gian tuyệt đối kể từ khi bạn bắt đầu mỗi lần qua vòng lặp.
bạn có thể đo thời gian chương trình của bạn hoạt động. Các chức năng sau giúp đo thời gian CPU kể từ khi bắt đầu chương trình:
tài liệu tham khảo của tôi : Hộp công cụ thuật toán tuần 1 khóa học về cấu trúc dữ liệu và chuyên môn thuật toán của Đại học California San Diego và Đại học nghiên cứu quốc gia Trường đại học kinh tế
vì vậy bạn có thể thêm dòng mã này sau thuật toán của bạn
cout << (double)clock() / CLOCKS_PER_SEC ;
Đầu ra dự kiến: đầu ra đại diện cho số lượng clock ticks per second
perf stat -d ./a.out