我想知道在linux下执行一个程序所需的时间(以微秒为单位)(或更准确)。目前我使用的是time命令,但它给我的最大精度是毫秒。有没有办法调整time命令以提供更好的准确性,或者是否有其他命令可以做到这一点?
发布于 2011-12-21 15:34:33
你的问题是没有意义的:你不会得到重复的测量,即使在毫秒的时间报告。
添加更多的数字只会增加噪声。你也可以从/dev/random中提取额外的数字。
发布于 2011-12-21 16:42:33
我确实同意Employed Russian's answer的观点。对于这样的测量,想要微秒级的精度是没有多大意义的。所以你得到的任何额外的数字都是没有意义的(本质上是随机的)。
如果您有要测量的应用程序源代码,则可以使用clock或clock_gettime函数,但不要期望超过12微秒的精确度。还有RDTSC机器指令。
阅读linux clock howto。
不要忘记,从应用程序的角度来看,执行的时间是不确定的和不可重现的(考虑上下文切换、缓存未命中、中断等)。在随机时间发生)。
如果你想测量整个程序的性能,让它至少运行几秒钟,并测量几次(例如8次)时间,然后取平均值(可能会去掉最佳和最差的时间)。
如果你想测量特定功能的计时,学习如何profile你的应用程序(gprof,oprofile等)另请参阅this question
别忘了阅读time(7)
请注意,在当前(笔记本电脑、台式机、服务器)具有复杂CPU caches、TLB和branch predictors的out-of-order pipelined superscalar处理器上,一些微循环或机器指令序列的执行时间是不可重现的(每次运行纳秒计数都会有所不同)。操作系统还增加了随机性(scheduling、context switches、interrupts、page cache、copy-on-write、demand-paging ...)因此,用超过1毫秒的-or来测量某些命令的执行是没有任何意义的,如果幸运的话可能是100µs -精度。您应该对您的命令进行多次基准测试。
要获得重要的衡量标准,您应该将经过基准测试的应用程序更改为在几秒钟内运行(可能在main中添加一些循环,或者使用更大的数据集运行),并重复执行经过基准测试的命令12次。取平均值(或最差,或最好,取决于您追求的是什么)的度量。
如果系统time(1)不够,您可以制作自己的测量工具;另请参阅getrusage(2);我对您获得更准确的测量结果持怀疑态度。
顺便说一下,在我的i3770K最近的GNU/Linux (4.2内核,Debian/Sid/x86-64)台式计算机上,像time(2)或clock_gettime(2)这样的“系统”-calls运行大约3或4纳秒(多亏了vdso(7),它避免了真正的syscall的负担……)所以你可以经常在你的程序中使用它们。
发布于 2012-03-01 14:06:06
使用gettimeofday -提供微秒精度
https://stackoverflow.com/questions/8586354
复制相似问题