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

use*_*229 3 c linux time

**********************原创编辑**********************


我正在使用不同类型的时钟来获得LINUX系统的时间:

rdtsc,gettimeofday,clock_gettime

并且已经读过这样的各种线程:

我可以在Linux上获得最佳时序分辨率

如何获得linux gettimeofday()的微秒时间以及它的准确性是多少?

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

更快相当于gettimeofday

时间函数的粒度

为什么clock_gettime如此不稳定?

但我有点困惑:


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


粒度(或分辨率或精度)准确度不一样(如果我是对的......)

例如,在使用"clock_gettime"时,精度为10ms,因为我得到:

struct timespec res;
clock_getres( CLOCK_REALTIME, &res):
Run Code Online (Sandbox Code Playgroud)

并且粒度(定义为每秒滴答数)是100Hz(或10ms),正如我在执行时获得的:

 long ticks_per_sec = sysconf(_SC_CLK_TCK); 
Run Code Online (Sandbox Code Playgroud)

准确度为纳秒,如上面的代码所示:

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)我还测试omp_get_wtime作为Raxman所建议的,我发现了一个精密的纳秒,而不是真的比"clock_gettime更好(因为他们在这个网站做的):

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

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

使用CLOCK_MONOTONIC时clock_gettime比使用CLOCK_REALTIME时给出了更好的结果.那是正常的,因为首先计算处理时间和其他实时分别

c)我也发现了英特尔功能ippGetCpuClocks,但我没有测试它,因为它必须先注册:

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

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

感谢大家的回复!


Ker*_* SB 16

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

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

  • 粒度分辨率是计时器可以测量的最小时间间隔.例如,如果您具有1ms的粒度,那么以毫秒精度报告结果的点很少,因为它不可能精确到该精度水平.

在Linux上,粒度越来越大的可用定时器是:

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

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

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

在C++中,<chrono>标题围绕此提供了一定量的抽象,并std::high_resolution_clock试图为您提供最佳的时钟.