繁体   English   中英

VS2015中chrono :: system_clock :: now的精度

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM