在Linux上确定clock_gettime分辨率的正确方法

时间:2015-09-12 21:23:56

标签: c linux time profiling clock

作为家庭作业的一部分,我正在处理Linux上时间分辨率的古老恶魔。简而言之,我试图找到能够在运行Linux 2.6.32的Intel i5四核3.2 GHz机器上获得最佳分辨率的机制。

我查找了不同的方法,最后比较了clock_gettimeRDTSC的表现。我可能会为后者发布另一个问题,但是我这样做是为了找到clock_gettime电话所需的平均时间:

clock_gettime(CLOCK_MONOTONIC, &ts_start);
for(loopindex = 0; loopindex < 1000000; loopindex++)
    clock_gettime(CLOCK_MONOTONIC, &ts);
clock_gettime(CLOCK_MONOTONIC, &ts_end);

ts, ts1, ts2属于struct timespec类型。我后来计算ts_endts_start之间的差异并除以1000000.这给了我26ns。

然后我想到尝试别的东西:

clock_gettime(CLOCK_MONOTONIc, &ts1);
ts2 = ts1;
while(ts1.tv_sec == ts2.tv_sec && ts1.tv_nsec == ts2.tv_nsec)
    clock_gettime(CLOCK_MONOTONIC, &ts2);

ts1ts2再次属于struct timespec类型。我打印循环终止时的差异。现在,这给了我~100ns。

我对这里正确的方法是什么感到困惑,什么是正确的价值。在解释时间方面我是否缺少一些基本观点?此外,这让我对术语&#34;解决方案&#34;感到困惑。 26ns / 100ns是否表示系统上clock_gettime的实际分辨率为26ns / 100ns?

修改

我还改变了第一种方法的循环次数,并使用了较小的数字。第一个呼叫需要很长时间(~140ns),第二个呼叫需要较长时间,依此类推,直到它在所有后续呼叫中均为26ns。我猜这是由于缓存。这会影响正确的值吗?

1 个答案:

答案 0 :(得分:1)

了解内部时钟分辨率的最佳方法是使用posix中指定的函数clock_getres(2)

int clock_getres(clockid_t clk_id, struct timespec *res);