【发布时间】:2016-03-20 13:12:26
【问题描述】:
我正在使用以下代码块在我的程序中记录时间戳:
// Taken at relevant time
m.timestamp = std::chrono::high_resolution_clock::now().time_since_epoch();
// After work is done
std::size_t secs = std::chrono::duration_cast <std::chrono::seconds> (timestamp).count();
std::size_t nanos = std::chrono::duration_cast<std::chrono::nanoseconds> (timestamp).count() % 1000000000;
std::time_t tp = (std::time_t) secs;
std::string mode;
char ts[] = "yyyymmdd HH:MM:SS";
char format[] = "%Y%m%d %H:%M:%S";
strftime(ts, 80, format, std::localtime(&tp));
std::stringstream s;
s << ts << "." << std::setfill('0') << std::setw(9) << nanos
<< " - " << message << std::endl;
return s.str();
我将这些与准确的远程源记录的时间戳进行比较。当绘制时间戳差异且未启用 ntp 时,一天中会出现线性漂移(每 30 秒左右有 700 微秒)。
校正线性漂移后,我发现存在非线性分量。它可以在几个小时内漂移数百微秒。
第二张图看起来与使用与上述相同的方法拍摄的图相似,但启用了 NTP。预计数据中会出现较大的垂直峰值,但最小值的摆动令人惊讶。
有没有办法获得更精确的时间戳,但保留微秒/纳秒分辨率?如果时钟以可预测的方式偏离实际时间也没关系,但时间戳需要在很长一段时间内保持内部一致。
【问题讨论】:
-
这不是一个真正的 C++ 问题,因为 std::chrono 函数只是从您的操作系统/硬件获取时间。它似乎更有可能与您的硬件有关。
-
上次我查看 C++(尤其是 Microsoft)支持的“高分辨率计时器”时“不确定”尽管我试图实现不同的目标,但此 Q/A stackoverflow.com/questions/26003413/… 可能很有趣