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 |
|---|---|---|
nanoseconds | 10⁻⁹ giây | duration<long long, nano> |
microseconds | 10⁻⁶ giây | duration<long long, micro> |
milliseconds | 10⁻³ giây | duration<long long, milli> |
seconds | giây | duration<long long> |
minutes | phút | duration<long long, ratio<60>> |
hours | giờ | duration<long long, ratio<3600>> |
Mẹo hay
- Dùng
autochotime_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
volatilehoặ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.