2008-10-08 57 views
13

我需要一个非常准确的方法来计算我的程序的部分内容。我可以使用普通的高分辨率时钟,但这会返回壁挂时间,这不是我所需要的:我需要花费的时间只运行我的过程。微秒准确(或更好)的Linux进程时序

我清楚地记得看到一个Linux内核补丁,让我到时候我的流程,以纳秒的精度,但我忘了书签它,我忘了修补程序的名称以及:(。

我记得它的工作原理如下:

在每次上下文切换时,它都会读出高分辨率时钟的值,并将最后两个值的差值添加到正在运行的进程的进程时间中,从而产生高分辨率准确地查看过程的实际处理时间

定期处理时间保持使用常规时钟,这是我相信毫秒准确(1000Hz),这是我的目的太大了。

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

(其他建议也欢迎)


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

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

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

+0

也许这将有助于CFS:http://kerneltrap.org/node/8059 有一封来自作者的电子邮件,其中包含粗略的配置说明。 – 2008-10-09 11:28:58

回答

5

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

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

3

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

当然,除非你的程序并不需要能够在第二运行数百万次,它可能是速度不够快,如果你无法衡量一毫秒的运行时间。

+0

如果我想测量速度,这正是我所做的。你不说你的目标是什么。如果我想找出优化的内容,那么与测量不同的目标,需要不同的方法。为此,采样调用堆栈是我使用的。 – 2008-12-30 18:38:36

1

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

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

5

有关更多信息,请参阅this question

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

1

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

+2

您还需要同步TSC读取以防止指令重新排序打破测试周期以及通常的关联要求。 – 2010-12-31 06:07:48

相关问题