【发布时间】:2016-05-19 07:04:04
【问题描述】:
我有一个脚本,它使用 bash 内置命令 time 测量程序的执行时间。
我试图了解此命令的精度:据我所知,它以毫秒为单位返回精度,但它使用getrusage() 函数返回一个以微秒为单位的值。但是读取this paper,实际精度仅为10ms,因为getrusage 对时间的采样依赖于滴答声(= 100Hz)。这篇论文真的很老了(它提到了在奔腾 166Mhz 和 96Mb 内存上运行的 Linux 2.2.14)。
time 是否仍在使用getrusage() 和 100 Hz 刻度,还是在现代系统上更精确?
测试机运行Linux 2.6.32。
编辑:这是 muru 的代码的略微修改版本(也应该在旧版本的 GCC 上编译):修改变量 'v' 的值也改变措施之间的延迟,以发现最小粒度。大约 500,000 的值应该会在相对较新的 cpu 上触发 1ms 的变化(i5/i7 的第一个版本 @~2.5Ghz)
#include <sys/time.h>
#include <sys/resource.h>
#include <stdio.h>
void dosomething(){
long v = 1000000;
while (v > 0)
v--;
}
int main()
{
struct rusage r1, r2;
long t1, t2, min, max;
int i;
printf("t1\tt2\tdiff\n");
for (i = 0; i<5; i++){
getrusage(RUSAGE_SELF, &r1);
dosomething();
getrusage(RUSAGE_SELF, &r2);
t1 = r1.ru_stime.tv_usec + r1.ru_stime.tv_sec*1000000 + r1.ru_utime.tv_usec + r1.ru_utime.tv_sec*1000000;
t2 = r2.ru_stime.tv_usec + r2.ru_stime.tv_sec*1000000 + r2.ru_utime.tv_usec + r2.ru_utime.tv_sec*1000000;
printf("%ld\t%ld\t%ld\n",t1,t2,t2-t1);
if ((t2-t1 < min) | (i == 0))
min = t2-t1;
if ((t2-t1 > max) | (i == 0))
max = t2-t1;
dosomething();
}
printf("Min = %ldus Max = %ldus\n",min,max);
return 0;
}
但是精度与 linux 版本有关:Linux 3 及更高版本的精度是按我们的顺序排列的,而在 linux 2.6.32 上可能在 1ms 左右,可能还取决于特定的发行版。我想这种差异与在最近的 linux 版本上使用 HRT 而不是 Tick 有关。
在任何情况下,所有最近和不太最近的机器上的最大时间精度都是 1 毫秒。
【问题讨论】:
标签: linux bash performance time