在Linux中微秒准确(或更好)的进程时序

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

我清楚地记得看到一个Linux内核补丁,可以让我的stream程时间精确到毫微秒,除了我忘记了书签,我忘了补丁的名字以及:(。

我记得它是如何工作的,

在每个上下文切换时,它将读取高分辨率时钟的值,并将最后两个值的增量添加到正在运行的进程的处理时间。 这会生成一个高分辨率的过程实际处理时间的准确视图。

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

有谁知道我在说什么内核补丁? 我还记得它就像是一个字母之前或之后的字母 – 像“rtimer”之类的东西,但我不记得确切的。

(其他build议也欢迎)


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

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

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

Solutions Collecting From Web of "在Linux中微秒准确(或更好)的进程时序"

如果你正在寻找这个时间分辨率的水平,你可能试图做一些微观优化。 如果是这样的话,你应该看看PAPI 。 它不仅提供挂钟和虚拟(仅处理)定时信息,而且还提供对CPU事件计数器的访问,当您尝试提高性能时,计数器可能是不可或缺的。

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

看到这个问题一些更多的信息。

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

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

当然,除非你的程序不需要在一秒钟内运行数百万次,否则如果你不能测量一个毫秒的运行时间,那么速度可能就足够快了。

我相信CFC( 完全公平的调度 )是你在找什么。

如果你有一个相当新的2.6内核,你可以使用高精度事件定时器( HPET )。 查看Documentation / hpet.txt关于如何使用它。 这个解决方案是依赖于平台,我相信它只能在较新的x86系统上使用。 HPET至少有一个10MHz的计时器,所以它应该很容易适合您的要求。

我相信飞思卡尔的一些PowerPC实现也支持循环精确指令计数器。 几年前,我用这个来描述高度优化的代码,但我不记得它是什么。 我相信飞思卡尔有一个内核补丁,您必须申请才能从用户空间访问它。

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

可能对你有帮助(如果你用C / C ++做直接的,但是我希望它会给你指针,即使你不是)…它声称提供微秒的准确性,它只是通过你的标准。 🙂

我想我找到了我正在寻找的内核补丁。 张贴在这里,所以我不会忘记链接:

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

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

尝试CPU的时间戳计数器 ? 维基百科似乎建议使用clock_gettime()。