5

************************原文编辑************************


我正在使用不同类型的时钟来获取 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_REALTIME 相比,使用 CLOCK_MONOTONIC的clock_gettime给出了更好的结果。这很正常,因为第一个分别计算PROCESSING时间和另一个REAL TIME

c)我还发现了英特尔函数ippGetCpuClocks,但不是我没有测试过它,因为它必须先注册:

http://software.intel.com/en-us/articles/ipp-downloads-registration-and-licensing/

...或者您可以使用试用版

4

1 回答 1

21
  • 精度是信息量,即您报告的有效位数。(例如,我有 2 m、1.8 m、1.83 m 和 1.8322 m 高。所有这些测量结果都是准确的,但越来越精确。)

  • 准确性是报告信息与真实情况之间的关系。(例如,“我身高 1.70 m”比“1.8 m”更精确,但实际上并不准确。)

  • 粒度分辨率大约是计时器可以测量的最小时间间隔。例如,如果您有 1 毫秒的粒度,那么以纳秒精度报告结果就没有什么意义了,因为它不可能精确到那个精度级别。

在 Linux 上,可用的具有递增粒度的计时器有:

  • clock()<time.h>(20 ms 或 10 ms 分辨率?)

  • gettimeofday()来自 Posix <sys/time.h>(微秒)

  • clock_gettime()在 Posix 上(纳秒?)

在 C++ 中,<chrono>标头围绕这一点提供了一定程度的抽象,并std::high_resolution_clock试图为您提供最好的时钟。

于 2013-05-24T17:26:07.393 回答