参考Obtaining Time in milliseconds
为什么下面的代码会产生零作为输出?
int main()
{
steady_clock::time_point t1 = steady_clock::now();
//std::this_thread::sleep_for(std::chrono::milliseconds(1500));
steady_clock::time_point t2 = steady_clock::now();
auto timeC = t1.time_since_epoch().count();
auto timeD = t2.time_since_epoch().count();
auto timeA = duration_cast<std::chrono::nanoseconds > ( t1.time_since_epoch()).count();
auto timeB = duration_cast<std::chrono::nanoseconds > ( t2.time_since_epoch()).count();
std::cout << timeC << std::endl;
std::cout << timeB << std::endl;
std::cout << timeD << std::endl;
std::cout << timeA << std::endl;
std::cout << timeB - timeA << std::endl;
system("Pause");
return 0;
}
输出:
14374083030139686
1437408303013968600
14374083030139686
1437408303013968600
0
Press any key to continue . . .
我认为由于指令执行时间的原因,应该存在几纳秒的差异。
答案 0 :(得分:3)
在VS2012下,steady_clock
(and high_resolution_clock
)使用GetSystemTimeAsFileTime
,其a very low resolution(并且无法启动)。这是Microsoft的acknowledged as a bug。
您的解决方法是使用VS2015,使用Boost.Chrono,或使用QueryPerformanceCounter实现自己的时钟(请参阅:https://stackoverflow.com/a/16299576/567292)。
答案 1 :(得分:2)
仅仅因为你要求它代表以纳秒为单位的值,并不意味着测量的精度是以纳秒为单位。
当您查看输出时,您可以看到计数是纳秒/ 100.这意味着计数表示时间,单位为100纳秒。
但即使这样也没有告诉你构建steady_clock
的基础计数器的周期。所有你知道的是它不能超过100纳秒。
您可以使用period
steady_clock
成员告知计数器的实际使用期限
double periodInSeconds = double(steady_clock::period::num)
/ double(steady_clock::period::den);
回到你的问题:&#34;为什么下面的代码产生零作为输出?&#34;
由于您在now()
的两次调用之间没有完成任何重要工作,因此您不太可能耗尽100纳秒,因此答案是相同的 - 因此为零。