等效于 Linux 上的 GetTickCount()

Posted

技术标签:

【中文标题】等效于 Linux 上的 GetTickCount()【英文标题】:Equivalent to GetTickCount() on Linux 【发布时间】:2011-02-26 20:21:32 【问题描述】:

我正在寻找与 Linux 上的 GetTickCount() 等效的版本。

目前我正在使用 Python 的 time.time(),它可能会调用 gettimeofday()。我担心的是,如果时钟被 NTP 弄乱,返回的时间(unix 纪元)可能会发生不规律的变化。一个简单的过程或系统挂墙时间,仅以恒定速率正增加就足够了。

C 或 Python 中是否存在这样的时间函数?

【问题讨论】:

相关:How do I get monotonic time durations in python? 【参考方案1】:

您可以使用CLOCK_MONOTONIC,例如在 C 中:

struct timespec ts;
if(clock_gettime(CLOCK_MONOTONIC,&ts) != 0) 
 //error

查看此问题以了解 Python 方式 - How do I get monotonic time durations in python?

【讨论】:

在非常古老的 Linux 系统上,您可以使用 /proc/uptime 作为单调时间源。笨重但有效。 联机帮助页上有一条注释:CLOCK_MONOTONIC_RAW(自 Linux 2.6.28 起;Linux 特定)类似于 CLOCK_MONOTONIC,但提供对基于硬件的原始时间的访问,而不是受 NTP 调整的影响。这是否意味着CLOCK_MONOTONIC_RAW更合适? @MattJoiner:CLOCK_MONOTONIC_RAW 谈到 NTP 调整时,指的是时钟的速率,而不是绝对值。 CLOCK_MONOTONIC 不会跳过(顾名思义),通常是正确的选择。 这个关于 CLOCK_MONOTONIC 的问题可能值得一试:***.com/questions/3657289/…【参考方案2】:

这似乎有效:

#include <unistd.h>
#include <time.h>

uint32_t getTick() 
    struct timespec ts;
    unsigned theTick = 0U;
    clock_gettime( CLOCK_REALTIME, &ts );
    theTick  = ts.tv_nsec / 1000000;
    theTick += ts.tv_sec * 1000;
    return theTick;

是的,get_tick() 是我的应用程序的支柱。 每个“任务”由一个状态机组成 例如,可以在不使用线程和进程间通信的情况下执行多任务 可以实现非阻塞延迟。

【讨论】:

【参考方案3】:

您应该使用:clock_gettime(CLOCK_MONOTONIC, &amp;tp);。此调用与 Windows 上的 GetTickCount() 一样不受系统时间调整的影响。

【讨论】:

【参考方案4】:

是的,内核有高分辨率的计时器,但它是不同的。我建议您查看以可移植方式包装它的任何奇怪项目的来源。

在 C/C++ 中,我通常使用 #ifdef 这个并在 Linux 上使用 gettimeofday(),这给了我微秒级的分辨率。我经常将它作为一个分数添加到自纪元以来的秒数中,我也收到了双倍。

【讨论】:

以上是关于等效于 Linux 上的 GetTickCount()的主要内容,如果未能解决你的问题,请参考以下文章

IIS 上的 Linux shell 等效项

Windows XP 和 GetTickCount64 上的 Qt 应用程序

等效于 .try() 的哈希以避免 nil 上的“未定义方法”错误? [复制]

Windows 等效于 linux cksum 命令

打开软件时出现无法定位程序输入点 GetTickCount64 于动态链接库 KERNEL32.dll 上。

等效于 Google Cloud Platform 上的 Kafka / AWS Kinesis Stream