【发布时间】:2012-08-10 11:40:23
【问题描述】:
我使用的是 64 位 Ubuntu 12.04 系统,并尝试了以下代码:
#include <unistd.h>
#include <time.h>
#include <stdio.h>
int
main(void)
{
struct timespec user1,user2;
struct timespec sys1,sys2;
double user_elapsed;
double sys_elapsed;
clock_gettime(CLOCK_REALTIME, &user1);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &sys1);
sleep(10);
clock_gettime(CLOCK_REALTIME, &user2);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &sys2);
user_elapsed = user2.tv_sec + user2.tv_nsec/1E9;
user_elapsed -= user1.tv_sec + user1.tv_nsec/1E9;
printf("CLOCK_REALTIME: %f\n", user_elapsed);
sys_elapsed = sys2.tv_sec + sys2.tv_nsec/1E9;
sys_elapsed -= sys1.tv_sec + sys1.tv_nsec/1E9;
printf("CLOCK_PROCESS_CPUTIME_ID: %f\n", sys_elapsed);
}
据我了解,这应该打印类似
CLOCK_REALTIME: 10.000117
CLOCK_PROCESS_CPUTIME_ID: 10.001
但就我而言,我得到的是
CLOCK_REALTIME: 10.000117
CLOCK_PROCESS_CPUTIME_ID: 0.000032
这是正确的行为吗?如果是这样,我如何确定 sys1 和 sys2 的实际秒数?
当我将 CLOCK_PROCESS_CPUTIME_ID 更改为 CLOCK_REALTIME 时,我得到了预期的结果,但这不是我想要的,因为我们需要精度。
[EDIT] 显然 CLOCK_PROCESS_CPUTIME_ID 返回 cpu 用于处理的实际时间。 CLOCK_MONOTONIC 似乎返回了正确的值。但精度如何?
【问题讨论】:
-
啊,等一下。所以 CLOCK_PROCESS_CPUTIME_ID 应该只返回使用实际 CPU 功率的经过时间?
-
对,它只测量 CPU 时间。
-
如果是这样,我应该使用什么 CLOCK_REALTIME?这真的很精确吗?我不需要纳秒,但尽可能精确的微秒......
-
您要测量什么?
CLOCK_MONOTONIC可能对你很感兴趣。 -
我们正在开发一个课程,以便为视频播放和类似事情提供精确的时间。 github.com/obviousjim/ofxMSATimer/blob/develop/src/… 基本上我们只需要精确地获取应用程序的当前运行时间(以微秒为单位)。
标签: c precision clock timing gettime