Xử lý thời gian với <chrono>
Thư viện <chrono> (từ C++11) cung cấp các công cụ hiện đại, an toàn về kiểu dữ liệu để làm việc với thời gian - từ đo hiệu năng chương trình đến biểu diễn ngày giờ.
Đo thời gian thực thi của một đoạn code
Phần tiêu đề “Đo thời gian thực thi của một đoạn code”Đây là ứng dụng phổ biến nhất của <chrono> trong thực tế - rất hữu ích khi cần biết một đoạn code chạy nhanh hay chậm:
#include <chrono>#include <iostream>#include <thread>
int main() { auto start = std::chrono::high_resolution_clock::now();
// Đoạn code cần đo thời gian std::this_thread::sleep_for(std::chrono::milliseconds(100));
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double, std::milli> elapsed = end - start; std::cout << "Thoi gian thuc thi: " << elapsed.count() << " ms" << std::endl;
return 0;}Các đơn vị thời gian (duration)
Phần tiêu đề “Các đơn vị thời gian (duration)”#include <chrono>#include <iostream>
int main() { std::chrono::seconds sec(5); std::chrono::milliseconds ms(5000); std::chrono::minutes min(1);
std::cout << sec.count() << " giay" << std::endl; // 5 std::cout << ms.count() << " mili giay" << std::endl; // 5000 std::cout << min.count() << " phut" << std::endl; // 1
return 0;}<chrono> cho phép chuyển đổi qua lại giữa các đơn vị này một cách an toàn về kiểu, tránh được lỗi nhầm đơn vị (giây với mili giây) thường gặp khi tự tính toán thủ công bằng số nguyên.
Lấy thời điểm hiện tại (ngày giờ hệ thống)
Phần tiêu đề “Lấy thời điểm hiện tại (ngày giờ hệ thống)”#include <chrono>#include <iostream>#include <ctime>
int main() { auto now = std::chrono::system_clock::now(); std::time_t now_time = std::chrono::system_clock::to_time_t(now);
std::cout << "Thoi diem hien tai: " << std::ctime(&now_time);
return 0;}system_clock gắn với đồng hồ hệ thống (có thể bị điều chỉnh, ví dụ đồng bộ NTP), trong khi high_resolution_clock/steady_clock phù hợp hơn cho việc đo khoảng thời gian trôi qua vì chúng không bao giờ “chạy ngược”.
Tạm dừng chương trình với std::this_thread::sleep_for
Phần tiêu đề “Tạm dừng chương trình với std::this_thread::sleep_for”#include <chrono>#include <thread>#include <iostream>
int main() { std::cout << "Bat dau..." << std::endl; std::this_thread::sleep_for(std::chrono::seconds(2)); // Tạm dừng 2 giây std::cout << "Da doi 2 giay!" << std::endl;
return 0;}<chrono> so với <ctime> (thư viện C cũ)
Phần tiêu đề “<chrono> so với <ctime> (thư viện C cũ)”C++ kế thừa từ C thư viện <ctime> (time(), clock()) để làm việc với thời gian, nhưng các hàm này thường làm việc với số nguyên thô (giây kể từ epoch) - dễ nhầm lẫn đơn vị và ít an toàn về kiểu. <chrono> là lựa chọn hiện đại nên ưu tiên trong code mới.
Tổng kết
Phần tiêu đề “Tổng kết”<chrono>cung cấp cách làm việc với thời gian an toàn về kiểu, từ C++11- Dùng
high_resolution_clock/steady_clockđể đo khoảng thời gian trôi qua (đo hiệu năng) - Dùng
system_clockkhi cần thời điểm thực tế (ngày giờ hệ thống) std::this_thread::sleep_fortạm dừng chương trình trong một khoảng thời gian xác định