2017-07-28 210 views
0

在VS2015上調用chrono::system_clock::now()時,我看到一個奇怪的行爲。如果您在循環中調用chrono::system_clock::now(),則生成的時間點似乎具有1毫秒的精度。下面是代碼:在VS2015中chrono :: system_clock :: now的精度

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

當我運行用VS 2015編譯的代碼時,我看到100 ns的步數。我懷疑你是在無意中編譯和/或鏈接VS的舊版標準庫。 MSDN表示,對VS 2015中的時鐘進行了更改以符合標準。 –

+0

我正在編譯對VS 2015版本14.0.25431.01更新3 – pchandra

+0

這是我正在使用的確切版本,但我無法重現您的結果。你確定你得到了相應版本的標準庫,而不是以某種方式拾取一個較舊的版本? –

回答

0

微軟的實現是這樣的:

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

_Xtime_get_ticks()使用GetSystemTimeAsFileTime()。這個函數的精度是1毫秒。

相關問題