Hãy để tôi hỏi câu hỏi của tôi bằng chương trình thử nghiệm này:độ phân giải std :: chrono :: high_resolution_clock không tương ứng với phép đo
#include <iostream>
#include <chrono>
using std::chrono::nanoseconds;
using std::chrono::duration_cast;
int main(int argc, char* argv[])
{
std::cout << "resolution (nano) = " << (double) std::chrono::high_resolution_clock::period::num
/std::chrono::high_resolution_clock::period::den * 1000 * 1000 * 1000 << std::endl;
auto t1 = std::chrono::high_resolution_clock::now();
std::cout << "how much nanoseconds std::cout takes?" << std::endl;
auto t2 = std::chrono::high_resolution_clock::now();
auto diff = t2-t1;
nanoseconds ns = duration_cast<nanoseconds>(diff);
std::cout << "std::cout takes " << ns.count() << " nanoseconds" << std::endl;
return 0;
}
Output trên máy tính của tôi:
độ phân giải (nano) = 100
bao nhiêu nano giây std :: cout mất?
std :: cout mất 1.000.200 nano giây
tôi nhận được một trong hai 1000200
hoặc 1000300
hoặc 1000400
hoặc 1000500
hoặc 1000600
hoặc 2000600
kết quả là (= 1 hoặc 2 micro). Rõ ràng là độ phân giải của std::chrono
là không phải 100 nano giây hoặc cách tôi đo thời gian std::cout
là sai. (tại sao tôi không bao giờ nhận được điều gì đó từ 1 đến 2 micro giây, ví dụ 1500000
?)
Tôi cần bộ hẹn giờ có độ phân giải cao trong C++. Bản thân hệ điều hành cung cấp bộ hẹn giờ có độ phân giải cao vì tôi có thể đo lường mọi thứ với độ chính xác micro giây bằng cách sử dụng lớp C# Stopwatch
trên cùng một máy. Vì vậy, tôi chỉ cần sử dụng đúng bộ hẹn giờ có độ phân giải cao mà hệ điều hành có!
Làm cách nào để sửa chương trình của tôi để tạo ra kết quả mong đợi?
Tôi không thể trả lời câu hỏi, nhưng đối với những gì nó có giá trị, mã này tạo ra kết quả chính xác (độ chính xác nano giây) trên máy tính của tôi, vì vậy rất có thể sự cố trong triển khai thư viện của bạn. – Mankarse
Liên quan: http://stackoverflow.com/questions/8386128/how-to-get-the-precision-of-high-resolution-clock – stefan
Bạn đang sử dụng VS2012? – David