Như những người khác đã lưu ý, hàm time () trong thư viện chuẩn C không có độ phân giải tốt hơn một giây. Hàm C di động hoàn toàn duy nhất có thể cung cấp độ phân giải tốt hơn có vẻ là clock (), nhưng đo thời gian của bộ xử lý thay vì thời gian của đồng hồ. Nếu một trong số đó là nội dung để giới hạn bản thân trong các nền tảng POSIX (ví dụ: Linux), thì hàm clock_gettime () là một lựa chọn tốt.
Kể từ C ++ 11, có nhiều phương tiện thời gian tốt hơn có sẵn cung cấp độ phân giải tốt hơn ở dạng rất dễ mang theo trên các trình biên dịch và hệ điều hành khác nhau. Tương tự, thư viện boost :: datetime cung cấp các lớp thời gian có độ phân giải cao, có tính di động cao.
Một thách thức trong việc sử dụng bất kỳ phương tiện nào trong số này là thời gian trễ được giới thiệu bằng cách truy vấn đồng hồ hệ thống. Từ việc thử nghiệm với clock_gettime (), boost :: datetime và std :: chrono, sự chậm trễ này có thể dễ dàng trở thành vấn đề của micro giây. Vì vậy, khi đo thời lượng của bất kỳ phần nào trong mã của bạn, bạn cần cho phép có lỗi đo ở kích thước này hoặc cố gắng sửa lỗi không có lỗi đó theo một cách nào đó. Lý tưởng nhất là bạn có thể muốn thu thập nhiều phép đo thời gian được thực hiện bởi chức năng của mình và tính thời gian trung bình hoặc tối đa / tối thiểu được thực hiện trong nhiều lần chạy.
Để giúp giải quyết tất cả các vấn đề về tính di động và thu thập số liệu này, tôi đã phát triển thư viện cxx-rtimers có sẵn trên Github để cố gắng cung cấp API đơn giản cho các khối thời gian của mã C ++, tính toán các lỗi không và thống kê báo cáo từ nhiều bộ định thời được nhúng trong mã của bạn. Nếu bạn có trình biên dịch C ++ 11, bạn chỉ cần #include <rtimers/cxx11.hpp>
sử dụng một cái gì đó như:
void expensiveFunction() {
static rtimers::cxx11::DefaultTimer timer("expensiveFunc");
auto scopedStartStop = timer.scopedStart();
// Do something costly...
}
Khi thoát khỏi chương trình, bạn sẽ nhận được một bản tóm tắt các số liệu thống kê thời gian được viết cho std :: cerr, chẳng hạn như:
Timer(expensiveFunc): <t> = 6.65289us, std = 3.91685us, 3.842us <= t <= 63.257us (n=731)
trong đó cho thấy thời gian trung bình, độ lệch chuẩn của nó, giới hạn trên và dưới và số lần hàm này được gọi.
Nếu bạn muốn sử dụng các hàm thời gian dành riêng cho Linux, bạn có thể #include <rtimers/posix.hpp>
hoặc nếu bạn có các thư viện Boost nhưng trình biên dịch C ++ cũ hơn, bạn có thể #include <rtimers/boost.hpp>
. Ngoài ra còn có các phiên bản của các lớp hẹn giờ này có thể thu thập thông tin thời gian thống kê từ nhiều luồng. Ngoài ra còn có các phương pháp cho phép bạn ước tính sai số không liên quan đến hai truy vấn liên tiếp ngay lập tức của đồng hồ hệ thống.
time()
trả về một giá trị khác.