Bỏ qua để đến nội dung

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

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.

  • <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_clock khi cần thời điểm thực tế (ngày giờ hệ thống)
  • std::this_thread::sleep_for tạm dừng chương trình trong một khoảng thời gian xác định