我有一个脚本,使用bash内置命令
测试机器正在运行Linux 2.6.32。 编辑:这是muru代码的稍微修改版本(应该也可以在旧版本的GCC上编译):修改变量“v”的值,同时更改测量之间的延迟,以便发现最小粒度。在相对较新的CPU上(第一版i5/i7 @~2.5Ghz),大约500,000的值应该会触发1毫秒的变化。
然而,精度受Linux版本限制:在Linux 3及以上版本中,精度为微秒级别,而在Linux 2.6.32上可能为1毫秒左右,这可能也取决于具体的发行版。我猜这种差异与近期Linux版本使用HRT而不是Tick有关。
time
来测量程序的执行时间。我想了解这个命令的精度:据我所知,它返回以毫秒为单位的精度,但它使用getrusage()
函数返回微秒级的值。但是根据这篇论文的阅读,实际精度只有10毫秒,因为getrusage
基于时钟滴答(= 100Hz)对时间进行采样。该论文非常古老(它提到在Pentium 166Mhz上运行Linux 2.2.14,并具有96Mb的RAM)。
time
是否仍然使用getrusage()
和100 Hz的时钟滴答或在现代系统上更加精确?测试机器正在运行Linux 2.6.32。 编辑:这是muru代码的稍微修改版本(应该也可以在旧版本的GCC上编译):修改变量“v”的值,同时更改测量之间的延迟,以便发现最小粒度。在相对较新的CPU上(第一版i5/i7 @~2.5Ghz),大约500,000的值应该会触发1毫秒的变化。
#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上可能为1毫秒左右,这可能也取决于具体的发行版。我猜这种差异与近期Linux版本使用HRT而不是Tick有关。
无论如何,所有新旧机器的最大时间精度都为1毫秒。