【问题标题】:Computing time on Linux: granularity and precisionLinux 上的计算时间:粒度和精度
【发布时间】: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 :它确实澄清了很多事情,谢谢!

标签: c linux time


【解决方案1】:
  • Precision 是信息量,即您报告的有效位数。 (例如,我身高 2 米、1.8 米、1.83 米和 1.8322 米。所有这些测量结果都很准确,但越来越精确。)

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

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

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

  • clock() 来自 <time.h>(20 毫秒还是 10 毫秒分辨率?)

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

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

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

【讨论】:

  • 你的意思是 C++11,2011 年末最新的 C++ 标准
  • 感谢@Kerrek 的这些澄清。我见过关于 c++ chrono,但我留在这个程序的 C 代码中
猜你喜欢
  • 1970-01-01
  • 2015-12-08
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 2015-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多