在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上以这种方式运行吗?
答案 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毫秒。