跨平台微秒精确时间戳

Cross-platform microsecond precise timestamp

本文关键字:时间戳 跨平台      更新时间:2023-10-16

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

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

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

在某些平台上可以实现微秒粒度,但不会获得微秒精度,因为系统时钟肯定不是那么准确。 在典型的台式计算机上,预计偏移量为数秒甚至数分钟,在使用 NTP 精心同步的计算机上,偏移量可降至毫秒。

在我已知的所有Unix系统(包括Linux)上,好的旧gettimeofday会产生10ms到1μs之间的粒度,具体取决于操作系统和硬件:

rc = gettimeofday(&tv, NULL);

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

rc = clock_gettime(CLOCK_REALTIME, &ts);

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