【问题标题】:Cross-platform microsecond precise timestamp跨平台微秒级精确时间戳
【发布时间】:2015-04-29 09:22:15
【问题描述】:

我正在编写一个日志类,它应该以微秒精度级别提供当前日期和时间。我不想直接使用 snprintf 格式化所有日志消息(以便可以有效地过滤它们),而是有一个这样的结构:

struct log_record {
    timestamp_t time;
    uint32_t    msg_len;
    ...
}

这应该能够与其他可能具有另一个 cpu、操作系统(linux 和 windows)等的机器(例如使用 tcp)共享。是否存在现有的时间戳格式/库(可能在某些数据库系统中? ) 可以满足我的要求吗?

【问题讨论】:

  • 您意识到将多台机器的时钟同步到微秒级并非易事,对吧?换句话说,即使您可以获得具有该精度的本地时间戳(您可以),您也不能仅仅假设它们相对于全球时间是正确的。 NTP 大约几毫秒。
  • 是的,我不需要它们非常正确。全球时间。但是我希望有一个服务器可以为所有单个客户端完成所有重要的日志记录(格式化消息,按某些标准过滤它们,检查逻辑一致性,将它们存储到文件中......)。为此,我需要有一个跨平台的时间戳数据格式/结构。

标签: c++ c


【解决方案1】:

您可以在某些平台上实现微秒粒度,但您不会获得微秒精度,因为系统时钟肯定不是那么准确。在典型的桌面机器上预计会有几秒甚至几分钟的偏移,在使用 NTP 仔细同步的机器上会低至几毫秒。

在我所知的所有 Unix 系统(包括 Linux)上,旧的 gettimeofday 产生的粒度介于 10 毫秒和 1 微秒之间,具体取决于操作系统和硬件:

rc = gettimeofday(&tv, NULL);

在大多数 Linux 平台上,clock_gettime 提供了更好的粒度,低至数百纳秒:

rc = clock_gettime(CLOCK_REALTIME, &ts);

在 Windows 上,您需要使用 GetSystemTimeAsFileTime 函数,然后您可以使用 FileTimeToSystemTime 函数将其结果转换为有用的东西。但是,这只会让您获得几十毫秒的粒度,除非您使用性能计数器玩弄脏把戏。

【讨论】:

  • Windows 8 添加了GetSystemTimePreciseAsFileTime,它为你做了一些肮脏的把戏。 Windows 高分辨率时间的推荐阅读是here
  • 你是对的,但是这些函数返回不同的数据类型,一个结构 timeval(由两个 long int 组成 - 但 long int 可能因平台而异)和一个 FILETIME 结构。最重要的是,还有2038年的问题。我需要的是一个固定宽度/格式的时间戳,我可以在 32 位和 64 位 ARM、Intel、AMD cpus 以及具有不同编译器的 linux 和 windows 系统上创建和解析它。或者一些可以解决问题的转换库。
  • 我的帖子和 Mike Vine 的评论为您提供了自己推出所需的一切。一旦您编写并调试了这样的 sn-p,请随时编辑您的问题以指向它。
猜你喜欢
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
  • 2016-07-14
  • 2017-08-11
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多