chrono的精度:: system_clock ::现在在VS2015中

时间:2017-07-28 19:20:16

标签: c++ visual-studio-2015 chrono

在VS2015上调用chrono::system_clock::now()时,我看到了一种奇怪的行为。如果在循环中调用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上以这种方式运行吗?

1 个答案:

答案 0 :(得分:0)

Microsoft的实施是这样的:

namespace std
{
    namespace chrono
    {
        struct system_clock
        {
            static time_point now() __NOEXCEPT
            {
                return (time_point(duration(_Xtime_get_ticks())));
            }

_Xtime_get_ticks()使用 GetSystemTimeAsFileTime()。该函数的精度为1毫秒。