13

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

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

我记得它是如何工作的:

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

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

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

(也欢迎其他建议)


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

  • times() 以毫秒为单位返回值 21、22。
  • clock() 返回值 21000、22000,粒度相同。
  • getrusage() 正在返回诸如 210002、22001 (和类似的)之类的值,它们看起来有更好的准确性,但这些值看起来明显相同。

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

4

8 回答 8

5

有关更多信息,请参阅此问题。

我用过的东西是gettimeofday()。它提供了具有秒和微秒的结构。在代码之前调用它,然后再调用它。然后只需使用 timersub 减去这两个结构,您就可以从 tv_usec 字段中获取以秒为单位的时间。

于 2008-12-30T16:11:39.243 回答
5

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

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

于 2008-12-30T18:09:47.900 回答
3

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

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

于 2008-10-08T14:49:11.430 回答
1

我相信 CFC(完全公平调度程序)是您正在寻找的。

于 2008-10-08T14:50:56.280 回答
1

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

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

于 2008-10-08T14:57:55.487 回答
1

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

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

于 2008-10-08T16:53:42.833 回答
1

我想我找到了我正在寻找的内核补丁。把它贴在这里,这样我就不会忘记链接:

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

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

于 2008-11-19T10:53:36.367 回答
1

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

于 2008-12-30T19:13:48.037 回答