我有一個腳本,使用bash內建命令time
來測量程序的執行時間。bash內建時間命令的精度是多少?
我想了解這個命令的精確度:據我所知,它返回精度以毫秒爲單位,但它使用getrusage()
函數,它返回一個以微秒爲單位的值。但是讀取this paper時,實際精度僅爲10ms,因爲getrusage
會依靠刻度(= 100Hz)對時間進行採樣。這篇文章真的很老了(它提到運行在Pentium 166Mhz和96Mb RAM上的Linux 2.2.14)。
是time
仍然使用getrusage()
和100赫茲刻度或更精確的現代系統?
測試機器運行的是Linux 2.6.32。
EDIT:這是一個稍作修改的版本(其也應彙編關於舊版本的GCC)的穆魯的代碼:爲了當場修改變量和「v」也變化的措施之間的延遲的值最小粒度。約50萬的值應該觸發一個相對較新的CPU
#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版本(的i5/i7的@〜2.5Ghz的第一版本)爲1ms的變化:使用Linux 3及以上的精度是按照我們的順序,而在Linux 2.6.32上可能會在1ms左右,可能還取決於具體的發行版。我想這種差異與在最近的linux版本中使用HRT而不是Tick相關。
在任何情況下,在所有最近和未近期的機器上,最大時間精度爲1ms。
謝謝,似乎是合理的。看看我關於RTOS的舊筆記,似乎Linux tick可以配置爲100,250和1000Hz,還有高精度定時器,它比1ms更精確。 也許我想念一些東西,但我認爲你應該乘以1,000,000,因爲1s = 10^-6s 但是對於我的目的,我可以假設時間(1ms)報告的最大精度 –
@AlessandroValentini糟糕。這是重複使用測試代碼的結果。 :D – muru
無論如何它不影響測試,直到你運行短程序;) –