Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Sử dụng hàm clock() đo thời gian trong C++

Hàm clock() trong <ctime> trả về số "clock ticks" (nhịp đồng hồ) CPU mà tiến trình đã tiêu thụ từ khi bắt đầu. Dùng để đo thời gian thực thi CPU (không phải wall-clock time).

Công thức


thời_gian_giây = (clock_cuối - clock_đầu) / CLOCKS_PER_SEC

Ví dụ: Đo thời gian chờ người dùng nhấn Enter

#include <iostream>
#include <ctime>

using namespace std;

void wait_for_enter() {
    cout << "Nhan Enter de dung dem..." << endl;
    while (true) {
        if (getchar()) break;
    }
}

int main() {
    clock_t start = clock();  // Lấy thời điểm bắt đầu
    
    cout << "Bat dau dem..." << endl;
    wait_for_enter();
    cout << "Ket thuc dem." << endl;
    
    clock_t end = clock();  // Lấy thời điểm kết thúc
    
    double cpu_time = static_cast<double>(end - start) / CLOCKS_PER_SEC;
    cout << "Thoi gian CPU: " << cpu_time << " giay" << endl;
}

Kết quả mẫu

Bat dau dem...
Nhan Enter de dung dem...
Ket thuc dem.
Thoi gian CPU: 3.546 giay

Lưu ý quan trọng

Đặc điểmclock()chrono::steady_clock
Đo lườngCPU timeWall-clock time
Độ chính xácThấp (~ms)Cao (nano/vi giây)
ThreadTổng tất cả threadThời gian thực
ChuẩnC (C++98)C++11

Ví dụ so sánh


#include <iostream>
#include <ctime>
#include <chrono>
#include <thread>

int main() {
    // clock() - CPU time
    clock_t c1 = clock();
    this_thread::sleep_for(chrono::seconds(1));  // Ngủ 1 giây (không tốn CPU)
    clock_t c2 = clock();
    cout << "clock(): " << double(c2-c1)/CLOCKS_PER_SEC << "s\n";
    
    // chrono - wall time
    auto t1 = chrono::steady_clock::now();
    this_thread::sleep_for(chrono::seconds(1));
    auto t2 = chrono::steady_clock::now();
    cout << "chrono: " << chrono::duration<double>(t2-t1).count() << "s\n";
}

Kết quả

clock(): 0.000123s
chrono: 1.000456s

clock() gần như 0 vì sleep không tiêu thụ CPU. chrono đo đúng 1 giây thực.

Khuyến nghị

  • Đo hiệu năng thuật toán (CPU-bound): clock() hoặc chrono::high_resolution_clock
  • Đo thời gian thực (I/O, network, sleep): chrono::steady_clock
  • C++11+: Ưu tiên <chrono> - chính xác hơn, type-safe, cross-platform