Linux中微秒级的精确(或更好)进程计时

Linux中微秒级的精确(或更好)进程计时,linux,process,real-time,timing,high-resolution,Linux,Process,Real Time,Timing,High Resolution,我需要一个非常精确的方法来计时我的程序的各个部分。我可以使用常规的高分辨率时钟,但这将返回wallclock时间,这不是我需要的:我只需要运行进程所花费的时间 我清楚地记得看到一个Linux内核补丁,它允许我将进程的时间精确到纳秒级,只是我忘了给它加书签,也忘了补丁的名称:( 但我记得它是如何工作的: 在每个上下文开关上,它将读取高分辨率时钟的值,并将最后两个值的增量添加到正在运行的进程的进程时间中。这将生成进程实际进程时间的高分辨率精确视图 常规处理时间是使用常规时钟来保持的,我认为这是毫秒精

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

我清楚地记得看到一个Linux内核补丁,它允许我将进程的时间精确到纳秒级,只是我忘了给它加书签,也忘了补丁的名称:(

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

在每个上下文开关上,它将读取高分辨率时钟的值,并将最后两个值的增量添加到正在运行的进程的进程时间中。这将生成进程实际进程时间的高分辨率精确视图

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

有人知道我说的是什么内核补丁吗?我还记得它就像一个单词,前后都有一个字母——像“rtimer”之类的东西,但我记不清了

(欢迎提出其他建议)


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

  • times()以毫秒为单位返回值21和22
  • clock()返回值21000、22000,粒度相同
  • getrusage()返回的值有210002、22001(等等),它们看起来精度稍高一些,但明显相同

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

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


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

我相信CFC()就是你想要的。

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

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


可能会对您有所帮助(如果您使用C/C++,则直接使用它,但我希望即使您不使用它,它也能为您提供指针)…它声称提供微秒精度,这刚好通过您的标准。

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

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

有关更多信息,请参阅


我用来做这些事情的东西是gettimeofday()。它提供了秒和微秒的结构。在代码之前调用它,在代码之后再次调用它。然后用timersub减去这两个结构,就可以从tv_usec字段中获得所用的时间(以秒为单位)。

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


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

也许这会对CFS有所帮助:有一封作者的电子邮件,其中包含配置的大致说明。如果我想测量速度,这正是我所做的。你没有说你的目标是什么。如果我想找出要优化的内容,这与测量是不同的目标,需要不同的方法。为此,我使用的是对调用堆栈进行采样。您还需要同步TSC读取,以防止指令重新排序打破测试周期,以及通常的关联性要求。