我希望知道在linux下执行程序所需的时间(以微秒为单位)(或更高的准确性)。目前我正在使用time
命令,但它以最大毫秒精度给出了我。有没有办法调整time
命令以提供更好的准确性,还是有其他命令吗?
答案 0 :(得分:8)
你的问题没有意义:即使在几毫秒的时间内,你也不会重复测量。
添加更多数字只会增加噪音。您也可以从/dev/random
拉出额外的数字。
答案 1 :(得分:5)
我同意Employed Russian's answer。对于这些措施,要求微秒精度没有多大意义。所以你得到的任何额外数字都是毫无意义的(而且基本上是随机的)。
如果您有要测量的应用程序的源代码,您可以使用clock或clock_gettime函数,但不要超过十几微秒的准确度。还有RDTSC机器指令。
并且不要忘记执行的时间,从应用程序的角度来看,非确定性和不可再现(考虑上下文切换,缓存未命中,中断等等......随机发生)。
如果要测量整个程序的性能,请使其运行至少几秒钟,并测量几次(例如8次)的时间,并取平均值(可能会降低最佳和最差时间)。
如果您想测量特定功能的时间,请了解如何profile您的应用(gprof
,oprofile
等等...)
另请参阅this question
不要忘记阅读time(7)
请注意,当前(笔记本电脑,台式机,服务器)out-of-order pipelined superscalar处理器包含复杂CPU caches和TLB以及branch predictors ,一些微小循环或机器指令序列的执行时间是不可重复的(纳秒计数将从一次运行到下一次运行)。操作系统还增加了随机性(scheduling,context switches,interrupts,page cache,copy-on-write,demand-paging ...)所以它不会有意义的是测量一些命令的执行时间超过一毫秒 - 或者如果你是精确的话,可能是100μs。您应该多次对命令进行基准测试。
要获得重要的衡量标准,您应该将基准测试应用程序更改为在几秒钟内运行(可能在main
中添加一些循环,或者使用更大的数据集运行...),并重复基准测试命令十几次。这取决于措施的平均值(或最差,或最好,取决于你所追求的)。
如果系统time(1)不够,您可以建立自己的测量设施;另见getrusage(2);我对你得到更准确的措施持怀疑态度。
在我的i3770K最近的GNU / Linux(4.2内核,Debian / Sid / x86-64)台式计算机上BTW,“系统” - 像time(2)或clock_gettime(2)这样的呼叫在大约3或4纳秒内运行(感谢vdso(7),这可以避免真正的syscall ...的负担,所以你可以经常在你的程序中使用 。答案 2 :(得分:2)
使用gettimeofday - 提供微秒精度
答案 3 :(得分:0)
查看current_kernel_time()是否对您的要求有帮助。 我已经使用它并发现有用,因为它给出了纳秒级别的粒度。 更多详细信息为here。