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

Đo thời gian thực thi độ chính xác cao trong C/C++

Thư viện <chrono> (C++11) cung cấp high_resolution_clock — đồng hồ có độ phân giải cao nhất trên hệ thống (có thể đến nanosecond), lý tưởng để benchmark hiệu năng.

Các thành phần chính

  • std::chrono::high_resolution_clock: Đồng hồ độ phân giải cao.
  • time_point: Điểm thời gian.
  • duration_cast: Chuyển đổi đơn vị thời gian (nanoseconds, microseconds, milliseconds...).

Ví dụ: Đo thời gian vòng lặp rỗng

#include <iostream>
#include <chrono>

using namespace std;
using namespace std::chrono;

int main() {
    // Lấy thời điểm bắt đầu
    auto start = high_resolution_clock::now();
    
    // Đoạn code cần đo (vòng lặp rỗng 200 triệu lần)
    for (int i = 0; i < 200000000; ++i) {
        ; // Không làm gì
    }
    
    // Lấy thời điểm kết thúc
    auto end = high_resolution_clock::now();
    
    // Tính độ chênh lệch và chuyển sang nanosecond
    auto elapsed_ns = duration_cast<nanoseconds>(end - start).count();
    
    cout << "Thoi gian thuc thi: " << elapsed_ns << " nanoseconds" << endl;
    cout << "Thoi gian thuc thi: " << duration_cast<microseconds>(end - start).count() << " microseconds" << endl;
    cout << "Thoi gian thuc thi: " << duration_cast<milliseconds>(end - start).count() << " milliseconds" << endl;
    
    return 0;
}

Kết quả mẫu

Thoi gian thuc thi: 536395307 nanoseconds
Thoi gian thuc thi: 536395 microseconds
Thoi gian thuc thi: 536 milliseconds

Các đơn vị thời gian có sẵn

KiểuĐơn vịTypedef
nanoseconds10⁻⁹ giâyduration<long long, nano>
microseconds10⁻⁶ giâyduration<long long, micro>
milliseconds10⁻³ giâyduration<long long, milli>
secondsgiâyduration<long long>
minutesphútduration<long long, ratio<60>>
hoursgiờduration<long long, ratio<3600>>

Mẹo hay

  • Dùng auto cho time_point để code ngắn gọn.
  • Chạy nhiều lần và lấy trung bình để giảm nhiễu (context switch, cache...).
  • Tránh tối ưu hóa compiler xóa đoạn code đo (dùng volatile hoặc đọc kết quả).
  • Để đo chính xác hơn, có thể dùng steady_clock (đảm bảo đơn điệu, không bị điều chỉnh giờ hệ thống).

high_resolution_clock thường là alias của steady_clock hoặc system_clock tùy triển khai. Nên dùng steady_clock nếu cần đảm bảo đơn điệu.