Linux中微秒级(或更高精度)的进程计时

14

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

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

但我还记得它是如何工作的:

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

普通进程时间使用常规时钟保持,我相信它是毫秒精度(1000Hz),远远大于我需要的。

有人知道我在谈论什么内核补丁吗?我还记得它是一个单词,前面或后面带有一个字母 - 类似'rtimer'之类的东西,但我不记得具体是什么了。

(其他建议也是可以考虑的)


Marko提出的完全公平调度程序不是我要找的,但它看起来很有前途。我遇到的问题是我可以使用的调用仍然未返回足够细粒度的值。

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

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


也许这可以帮助CFS:http://kerneltrap.org/node/8059 有一封来自作者的电子邮件,包含配置的大致说明。 - Marko Dumic
8个回答

5

参见这个问题以获取更多信息。

我用过的一种方法是使用gettimeofday()。它提供了一个包含秒和微秒的结构体。在代码之前和之后调用它,然后只需使用timersub减去两个结构体,就可以从tv_usec字段中得到所花费的时间(以秒为单位)。


5
如果你正在寻找这个时间分辨率水平,你可能正在尝试进行一些微优化。如果是这种情况,你应该看看PAPI。它不仅提供了墙钟和虚拟(仅进程)时间信息,还提供了CPU事件计数器的访问权限,这在你努力提高性能时可能是不可或缺的。

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


3
如果你需要非常小的时间单位来测试软件速度(我假设是这个目的),我建议只需在循环中运行你想要计时的部分数百万次,记录循环前后的时间并计算平均值。这样做的一个好处(除了不需要弄清如何使用纳秒)是你会得到更一致的结果,因为操作系统调度器引起的随机开销会被平均掉。
当然,除非你的程序不需要每秒运行数百万次,否则如果你无法测量毫秒级别的运行时间,它可能已经足够快了。

这正是我测量速度时所做的。你没有说出你的目标是什么。如果我想找出要优化什么,那就是不同于测量的目标,需要不同的方法。为此,我使用采样调用堆栈的方法。 - Mike Dunlavey

1

1

2
您还需要同步TSC读取,以防指令重新排序破坏测试期间,同时满足通常的亲和性要求。 - Steve-o

1

1

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

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


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接