[英]Precision of chrono::system_clock::now in VS2015
我在VS2015上调用chrono chrono::system_clock::now()
时看到怪异的行为。 如果在循环中调用chrono chrono::system_clock::now()
,则生成的time_points的精度似乎为1毫秒。 这是代码:
using cl = chrono::system_clock;
set<cl::time_point> s;
for( int i=0; i <1000'000;++i) {
s.emplace(cl::now());
}
for(const auto& x : s) {
cout << duration_cast<nanoseconds>(x.time_since_epoch()).count() << endl;
}
cout << "size of set " << s.size() << endl;
这是输出时间戳的尾数(以纳秒为单位):
1,501,268,149,325,000,700
1,501,268,149,326,000,700
1,501,268,149,327,000,700
1,501,268,149,328,000,700
1,501,268,149,329,000,700
1,501,268,149,330,000,700
1,501,268,149,331,000,700
1,501,268,149,332,000,700
1,501,268,149,333,000,700
1,501,268,149,334,000,700
1,501,268,149,335,000,700
1,501,268,149,336,000,700
1,501,268,149,337,000,700
1,501,268,149,338,000,700
1,501,268,149,339,000,700
1,501,268,149,340,000,700
1,501,268,149,341,000,700
1,501,268,149,342,000,700
1,501,268,149,343,000,700
1,501,268,149,344,000,700
size of set 89
从时间戳可以看出,似乎system_clock生成的时间具有1毫秒的精度。 尽管Windows system_clock应该具有100纳秒的精度。 请注意,对于一百万条消息,它仅产生89个不同的时间戳。
如果我们使用clang运行相同的代码,则不会看到此问题,并且在这种情况下的精度为1微秒。 在VS2015上也使用steady_clock,精度为1纳秒。
有谁知道为什么system_clock在VS2015上表现为这种方式?
微软的实现是这样的:
namespace std
{
namespace chrono
{
struct system_clock
{
static time_point now() __NOEXCEPT
{
return (time_point(duration(_Xtime_get_ticks())));
}
_Xtime_get_ticks()使用GetSystemTimeAsFileTime() 。 该功能的精度为1毫秒。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.