Linux中的微秒准确(或更好)处理时序

时间:2008-10-08 12:48:42

标签: linux process real-time timing high-resolution

我需要一种非常准确的方法来计算我的程序部分时间。我可以使用常规的高分辨率时钟,但这将返回挂钟时间,这不是我需要的:我需要花时间只运行我的进程。

我清楚地记得看到一个Linux内核补丁,它允许我将我的进程计时到纳秒精度,除了我忘了给它添加书签,我也忘记了补丁的名称:(。

我记得它是如何运作的:

在每个上下文切换时,它将读出高分辨率时钟的值,并将最后两个值的增量添加到正在运行的进程的处理时间。这样可以高精度地准确查看过程的实际处理时间。

使用常规时钟保持常规处理时间,我相信毫秒精确(1000Hz),这对我来说太大了。

有谁知道我在说什么内核补丁?我还记得它就像一个带有字母的字母在它之前或之后 - 类似'rtimer'之类的东西,但我记不清了。

(欢迎提出其他建议)


Marko建议的完全公平调度程序不是我想要的,但看起来很有希望。我遇到的问题是,我可以用来获取处理时间的调用仍然没有返回足够精细的值。

  • times()返回值21,22,以毫秒为单位。
  • clock()返回值21000,22000,粒度相同。
  • getrusage()返回的值如210002,22001(以及其他一些),它们看起来有更好的准确性,但值看起来明显相同。

所以现在我可能遇到的问题是内核有我需要的信息,我只是不知道系统调用会返回它。

8 个答案:

答案 0 :(得分:5)

有关详情,请参阅this question

我用过这些东西的东西是gettimeofday()。它提供了一个秒和微秒的结构。在代码之前调用它,之后再调用它。然后使用timersub减去两个结构,你可以从tv_usec字段获得花费的时间。

答案 1 :(得分:5)

如果您正在寻找这种级别的时序分辨率,您可能正在尝试进行一些微优化。如果是这种情况,您应该查看PAPI。它不仅提供挂钟和虚拟(仅处理)时序信息,还提供对CPU事件计数器的访问,这在您尝试提高性能时是必不可少的。

http://icl.cs.utk.edu/papi/

答案 2 :(得分:3)

如果您需要非常小的时间单位(我假设)测试软件的速度,我会建议您只需要在循环中运行数百万次的部分,在循环之前和之后花费时间计算平均值。这样做的一个很好的副作用(除了不需要弄清楚如何使用纳秒)之外,你会得到更一致的结果,因为os sceduler引起的随机开销将被平均掉。

当然,除非您的程序不需要能够在一秒钟内运行数百万次,否则如果您无法测量毫秒运行时间,则可能足够快。

答案 3 :(得分:1)

我相信CFC(Completely Fair Scheduler)正是您所寻找的。

答案 4 :(得分:1)

如果你有一个相当新的2.6内核,你可以使用高精度事件计时器(HPET)。查看Documentation/hpet.txt有关如何使用它的信息。这个解决方案依赖于平台,我相信它只适用于较新的x86系统。 HPET具有至少10MHz的定时器,因此它可以轻松满足您的要求。

我相信飞思卡尔的几个PowerPC实现也支持循环精确指令计数器。我在几年前使用它来分析高度优化的代码,但我不记得它的名称。我相信飞思卡尔有一个内核补丁,您必须应用它才能从用户空间访问它。

答案 5 :(得分:1)

http://allmybrain.com/2008/06/10/timing-cc-code-on-linux/

可能对你有所帮助(如果你是用C / C ++做的话,可以直接使用,但我希望即使你不是这样也会给你指点)......它声称提供微秒精度,它只是通过你的标准。 :)

答案 6 :(得分:1)

我想我找到了我正在寻找的内核补丁。在此发布,所以我不会忘记链接:

http://user.it.uu.se/~mikpe/linux/perfctr/ http://sourceforge.net/projects/perfctr/

编辑:它适用于我的目的,但不是非常用户友好。

答案 7 :(得分:1)

尝试CPU的timestamp counter?维基百科似乎建议使用clock_gettime()。