在linux中计算时间:粒度和精度

**********************原始编辑**********************


我正在使用不同types的时钟在LINUX系统中获取时间

rdtsc,gettimeofday,clock_gettime

并已经阅读了这样的各种线程:

我可以在Linux上获得什么样的最佳时间分辨率?

如何获得linux gettimeofday()的微秒时间,它的准确度是多less?

我如何测量C中的时间间隔?

相当于gettimeofday的速度

粒度在时间函数

为什么clock_gettime如此不稳定?

但是我有点困惑:


粒度,分辨率,精度,准确度有什么区别?


粒度(或分辨率或精度)准确性是不一样的东西(如果我是正确的…)

例如,在使用“clock_gettime”时 ,精度为10ms,如下所示:

struct timespec res; clock_getres( CLOCK_REALTIME, &res): 

和粒度(定义为每秒刻度)是100Hz(或10ms),正如我在执行时得到的那样:

  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(使用命令)的粒度是多less?

b)我们可以改变他们(以任何方式)?

提前致谢


**********************编辑no2 **********************

大家好,我testing了一些新的时钟,我想分享信息:

a)在下面的页面中, David Terei做了一个很好的程序来比较各种钟表和他们的表演:

https://github.com/dterei/Scraps/tree/master/c/time

b)我也testing过omp_get_wtime,就像Raxman所build议的那样,我发现它的精确度是nsec,但并不比“clock_gettime(就像他们在这个网站上做的那样)好:

http://msdn.microsoft.com/en-us/library/t3282fe5.aspx

我认为这是一个面向窗口的时间函数

使用CLOCK_MONOTONIC的clock_gettime给出比使用CLOCK_REALTIME更好的结果。 这很正常,因为第一个分别计算PROCESSING时间和另一个REAL TIME

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

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

…或者您可以使用试用版

感谢所有的答复!


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

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

  • 粒度分辨率是计时器可以测量的最小时间间隔。 例如,如果您的粒度为1毫秒,那么以纳秒精度报告结果几乎没有意义,因为它不可能精确到这个精度水平。

在Linux上,粒度增加的可用计时器是:

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

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

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

在C ++中, <chrono>标题提供了一定程度的抽象,而std::high_resolution_clock试图给你最好的时钟。