【发布时间】:2013-05-20 08:27:59
【问题描述】:
**********************原文编辑************************
我在 Linux 系统上使用不同类型的时钟来获取时间:
rdtsc, gettimeofday, clock_gettime
并且已经阅读了诸如此类的各种问题:
但我有点困惑:
粒度、分辨率、精度和准确度有什么区别?
粒度(或分辨率或精度)和准确度不是一回事(如果我是对的......)
例如,在使用 "clock_gettime" 时,我得到的精度是 10 毫秒:
struct timespec res;
clock_getres(CLOCK_REALTIME, &res):
我在执行时得到的粒度(定义为每秒滴答声)为 100 Hz(或 10 ms):
long ticks_per_sec = sysconf(_SC_CLK_TCK);
如上代码所示,精度以纳秒为单位:
struct timespec gettime_now;
clock_gettime(CLOCK_REALTIME, &gettime_now);
time_difference = gettime_now.tv_nsec - start_time;
在下面的链接中,我看到这是Linux对粒度的全局定义,最好不要更改:
http://wwwagss.informatik.uni-kl.de/Projekte/Squirrel/da/node5.html#fig:clock:hw
所以我的问题是如果上面的评论是正确的,还有:
a) 我们可以看到 rdtsc 和 gettimeofday 的粒度是多少(通过命令)?
b) 我们可以更改它们(以任何方式)吗?
**********************编辑编号2************************
我已经测试了一些新时钟,我想分享信息:
a) 在下面的页面中,David Terei 做了一个很好的程序来比较各种时钟及其性能:
https://github.com/dterei/Scraps/tree/master/c/time
b) 我还按照 Raxman 的建议测试了 omp_get_wtime,我发现精度以 nsec 为单位,但并不比“clock_gettime”好(就像他们在这个网站上所做的那样):
http://msdn.microsoft.com/en-us/library/t3282fe5.aspx
我认为这是一个面向 Windows 的时间函数。
clock_gettime 使用 CLOCK_MONOTONIC 比使用 CLOCK_REALTIME 提供更好的结果。这很正常,因为第一个计算 PROCESSING 时间,另一个分别计算 REAL TIME
c) 我也找到了 Intel 函数 ippGetCpuClocks,但我没有测试它,因为它必须先注册:
http://software.intel.com/en-us/articles/ipp-downloads-registration-and-licensing/
...或者您可以使用试用版
【问题讨论】:
-
你忘了我最喜欢的一个:omp_get_wtime()。这是获取计算时间的最简单方法,它适用于 GCC、MSVC、MINGW 和 ICC(至少我安装的所有版本)
-
您曾问过“linux gettimeofday() 的微秒时间是如何获得的,其准确性如何?”的问题。有一个计数器在系统启动时初始化为 0,因此它表示自上次启动以来的时钟滴答数。计数器是一个称为 jiffies 的 64 位变量。每次发生中断时,内部计数器都会递增。do_gettimeofday 的分辨率接近微秒,它会询问计时硬件已经过去了多少 jiffy。精度因硬件而异,具体取决于硬件使用的硬件机制。
-
您阅读过time(7) 手册页吗?它提供了有趣的信息。
-
嗨@raxman,我已经测试了 omp_get_wtime() ,它非常好,但并不比 gettimeofday 或 clock_gettime 好,因为它很精确,但简单实用!
-
@Bastie :它确实澄清了很多事情,谢谢!