等效于 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, &tp);
。此调用与 Windows 上的 GetTickCount() 一样不受系统时间调整的影响。
【讨论】:
【参考方案4】:是的,内核有高分辨率的计时器,但它是不同的。我建议您查看以可移植方式包装它的任何奇怪项目的来源。
在 C/C++ 中,我通常使用 #ifdef
这个并在 Linux 上使用 gettimeofday()
,这给了我微秒级的分辨率。我经常将它作为一个分数添加到自纪元以来的秒数中,我也收到了双倍。
【讨论】:
以上是关于等效于 Linux 上的 GetTickCount()的主要内容,如果未能解决你的问题,请参考以下文章
Windows XP 和 GetTickCount64 上的 Qt 应用程序
等效于 .try() 的哈希以避免 nil 上的“未定义方法”错误? [复制]