2016-06-14 207 views
4

可能是一個愚蠢的問題。我注意到在Linux機器上運行C中的簡單Hello World程序時執行時間有所不同(儘管它不是語言特定的)。多次運行同一程序時,爲什麼執行時間有所不同?

程序:

#include<stdio.h> 
#include<time.h> 

int main() 
{ 
    clock_t begin, end; 
    double time_spent; 

    begin = clock(); 

    printf("%s", "Hello World\n"); 
    end = clock(); 
    time_spent = (double)(end - begin)/CLOCKS_PER_SEC; 
    printf("%f\n", time_spent); 
    return 0; 
} 

O/P:

$ ./hello 
Hello World 
0.000061 
$ ./hello 
Hello World 
0.000057 
$ ./hello 
Hello World 
0.000099 

這是一個四核機上測試用的0.4的平均負載和足夠的可用存儲器。雖然差別很小,但背後的原因是什麼?

+1

該程序的運行時間太短,因此偏差主要是由於「舍入」錯誤。 – Dummy00001

+0

另外:因爲你的消息可能沒有在'end = clock()之前輸出,所以你應該把''\ n%s「'改成''%s \ n」'' –

回答

6

除非您正在運行實時操作系統,否則運行時間至少會有輕微的變化。這是由於操作系統調度,在那段時間可能發生的任何I/O等。

0.04 ms的差異根本不是很大的差異。

如果程序在循環中運行至少幾秒鐘,應該減少變化的百分比。

+0

意思是我想檢查時間間隔在任何實時操作系統中,無論運行程序多少次,或進程間發生了多少上下文切換等,它幾乎總是等於實際時間。 – Mazhar

+2

@Mazhar在實時操作系統中,不應該有任何上下文切換。這就保證了程序的運行時間。仍然可能存在變化,例如正在討論的程序與各種I/O設備通信,但沒有外部變化。 – dbush

+3

@dbush:「在實時操作系統中,不應該有任何上下文切換」 - 錯誤。 RTOS保證確定性的延遲行爲,但不是沒有。它也沒有一般的上下文切換(有一些沒有的實現)。如果您的應用程序違反約束條件,則時序行爲無論如何都不是確定性的。 – Olaf

1

簡單的答案是:系統其餘部分發生了什麼。

有所有這些後臺進程都做'stuff':處理網絡數據包;保存或記錄數據到磁盤;決定醒來並檢查當前的網絡時間;誰知道!對於這樣短的時間間隔作爲你的代碼,這些微小的東西可以有很大的不同。嘗試循環1000次並檢查這些結果。當然,輸出到屏幕涉及圖形,更新,其他程序...也許你應該做一個:

unsigned i, j; 
... 
// Wait a LONG time! 
for (i=0;i<5u;++i) { // 5 is about a minute on my machine 
    for (j=0;j<~0u;++j) { 
     // Twiddle thumbs! 
    } // for 
} // for 

在你的時間。

0

兩個主要原因:

  1. 磁盤緩存:一旦你的可執行文件被加載的第一次,也可能保留在內存中,以便在隨後的運行中不需要從磁盤取回。

  2. 系統活動:您的處理器在耗費資源(內存,CPU,磁盤訪問)的同時還在做什麼?

相關問題