Cách sử dụng clock () trong C ++


127

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.


1
Lưu ý rằng thời gian đồng hồ treo tường không phải lúc nào cũng là một cách tốt để đo thời gian của vi khuẩn. Để có kết quả nhất quán, bạn phải làm việc xung quanh thang đo tần số CPU (bao gồm cả Intel turbo hoặc AMD tương đương, cho phép xung nhịp CPU của bạn cao hơn khi giới hạn nhiệt / năng lượng cho phép). Cấu hình với các bộ đếm hiệu suất có thể cung cấp cho bạn các phép đo trong các chu kỳ xung nhịp lõi (và cả thông tin chi tiết về việc liệu nút cổ chai có bị lỗi so với thông lượng lệnh so với độ trễ hay không, bằng cách xem các bộ đếm khác ngoài chu kỳ). Trên Linux,perf stat -d ./a.out
Peter Cordes

Câu trả lời:


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

5
Từ những gì tôi có thể thấy ở đây cplusplus.com/reference/ctime/clock , bạn không cần sử dụng ký hiệu "std ::". Chỉ cần sử dụng "đồng hồ ()"
gromit190

4
@Birger: Trong tất cả các dự án tôi đã làm việc nhưng kiểu mã yêu cầu std :: trước mỗi cuộc gọi std ::.
Th. Thielemann

2
Điều này có trả lại câu trả lời trong vài giây không?
Arnav Borborah

1
@ArnavBorborah Vâng, đúng vậy.
QuantumHoneybees

1
@ Th.Thielemann cả clock()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 stdtiề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 stdkhô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
kayleeFrye_onDeck

70

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

11
Nếu bạn đang đề xuất sử dụng C ++ 11, bạn cũng có thể viết using Clock=std::chrono::high_resolution_clock;. Xem bí danh .
JHBonarius

std::chrono::high_resolution_clockkhô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.
Kristianmitk

30

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

6
timeInSecondsluôn luôn đến 0.000000với tôi Làm thế nào tôi sẽ sửa nó?
noufal

3
@noufal Có lẽ thời gian sử dụng quá ngắn, nó hiển thị là 0. Bạn có thể thử sử dụng a long doubleđể có độ chính xác cao hơn.
Gerard

có lẽ độ phân giải đồng hồ của bạn không đủ cao, vì vậy không có thời gian trôi qua.
Marco Freudenberger

4

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


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"

Điều này không thêm vào câu hỏi đã được trả lời. Ngủ sau cl = clock () - cl không cần thiết. Và cout in giây không tích tắc mỗi giây. cl lưu trữ đồng hồ tích tắc.
Bác sĩ Yunke

0

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

Bạn có thể muốn kiểm tra điều kiện đầu tiên ... 10 msec = 1 giây?
Bác sĩ Yunke

2
Điều này sẽ tích lũy lỗi tương đối theo thời gian vì bạn không bao gồm thời gian cần in và usleepsẽ 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.
Peter Cordes

0

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:

  • Đồng hồ C ++ (gấp đôi) () / CLOCKS PER GIÂY với thời gian bao gồm.
  • python time.clock () trả về giá trị dấu phẩy động tính bằng giây.
  • Java System.nanoTime () trả về giá trị dài tính bằng nano giây.

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


1
Câu hỏi chỉ hỏi về c ++. Vì vậy, thật tuyệt khi bạn tham khảo các ngôn ngữ / kịch bản lập trình khác, nhưng nó không có chủ đề.
dboy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.