2011-12-21 64 views
5

我想知道在微秒(或更好的精度)linux下一个程序的执行所花费的时间量。目前我正在使用time命令,但它以最大毫秒精度给出了我。有什么方法可以调整time命令来提高精度,还是有其他一些命令吗?linux的时间命令微秒或更好的精度

回答

8

你的问题没有意义:即使在几毫秒的时间内报告,你也不会得到重复的测量结果。

添加更多数字只会增加噪音。您不妨从/dev/random中拉出额外的数字。

+0

我不明白你的观点。我说我想要的精度要好于毫秒,这在今天的处理器上不是不可能的,我们甚至可以达到几纳秒的精度。如何添加更多数字会增加更多噪音? – 2011-12-21 08:31:02

+5

@指导因为在非实时操作系统上运行的代码没有确定性执行。所需要的只是操作系统处理一些IP数据包,或运行另一个仲裁进程,或者crond唤醒以检查它是否应该执行某些操作,或者文件系统决定它应该写出脏页等,重新计时暂停了一段时间(少量),计时结束。操作系统的内置时序(例如CPU时间(与挂钟时间相对))通常也以具有一定分辨率的时间片计数(通常为1个内核刻度,1毫秒或更多) – nos 2011-12-21 08:53:19

+0

快速测试时间/ bin/sleep 0.006'似乎表明噪声小于1毫秒。所以虽然这样的测量确实是危险的,但Guanidene的要求本身并不是毫无意义的。 – 2015-09-28 13:29:59

0

看看current_kernel_time()是对你有帮助在您的要求。 我用了一下,发现有用的,因为它使粒度毫微秒级.. 更多细节here

4

我与Employed Russian's answer同意。对于这些措施而言微妙的准确度没有多大意义。所以你得到的任何额外数字都是没有意义的(并且基本上是随机的)。

如果您有要测量的应用程序的源代码,您可以使用clockclock_gettime函数,但不希望超过十几微妙的准确度。还有RDTSC机器指令。

阅读linux clock howto

不要忘记,从应用程序的角度来看,执行时间是非确定性和不可复制的(考虑上下文切换,缓存未命中,中断等等......随机发生)。如果要测量整个程序的性能,使其运行至少几秒钟,然后测量几次(例如8次)的时间,并取平均值(可能会丢弃最好的最差时间)。

如果要衡量特定功能的时机,学习如何profile您的应用程序(gprofoprofile等等...) 参见this question

不要忘记阅读time(7)

要意识到目前的(笔记本电脑,台式机,服务器)out-of-orderpipelinedsuperscalar处理器与复杂CPU cachesTLBbranch predictors,一些微小的循环或机器指令序列的执行时间s不可重现(纳秒计数将随着运行而变化)。和OS还增加了随机性(schedulingcontext switchesinterruptspage cachecopy-on-writedemand-paging ...),所以它没有任何意义,如果你是lucky-超过一毫秒来衡量一些命令的执行 - 或者也许100μS的精度。你应该多次测试你的命令。要获得重要的措施,您应该将基准测试应用程序更改为在几秒钟内运行(也许在main中添加一些循环,或者运行更大的数据集...),然后重复基准测试命令倍。采取措施的意思是(或者最糟糕的,或者最好的,这取决于你在做什么)。

如果系统time(1)是不够的,你可能会建立自己的测量工具;另见getrusage(2);我对你采取更准确的措施表示怀疑。

BTW我i3770K最近的GNU/Linux(4.2内核的Debian/SID/x86-64的)台式电脑, “系统” -calls像 time(2)clock_gettime(2)运行在约3或4纳秒(感谢 vdso(7)这避免了

一个真正的syscall ......)的负担,所以你可以使用它们你的程序很频繁。

2

使用gettimeofday - 给出微秒精度