2015-10-07 74 views
0

我工作的一個C程序(Ubuntu的14.04),做後基本上快了很多:爲什麼同樣程序的執行是第一次

  • 打開一個1GB的文件
  • 由緩衝區中讀取它的1MB
  • 查找在緩衝
  • 某些對象計算各對象的MD5簽名發現

我的節目採取10個secondes第一添e來實現這一點,然後下一次只需要1次(即使我在初始文件的第二個副本上工作)。

我知道這與緩存有關,我的程序在第一次後對緩存數據有效嗎?或直接顯示緩存的結果而不進行任何計算?

int main(int argc, char** argv) { 
unsigned char buffer[BUFFER_SIZE]; 
int i, number, count = 0; 
int start, end = 0; 
FILE *file; 
file = fopen("/dump/ram.lime", "r"); 
if (file != NULL) { 
    while ((number = fread(buffer, 1, BUFFER_SIZE, file)) > 0) {   
     for (i = 0; i < number; i++) { 
      find_object(buffer, &start, &end); 
      md5_compute(&buffer[start], end - start); 
     } 
    } 
} else { 
    printf("errno %d \n", errno); 
} 
printf("count = %d \n", count); 
return (EXIT_SUCCESS); 

}

+1

請發佈您的代碼。 – LPs

+3

從磁盤讀取1GB文件可能需要將近10秒鐘的時間。在內存中時,操作系統會將其保留一段時間,因爲有人可能想再次閱讀它。 –

+2

它也取決於操作系統。 –

回答

1

因爲第二次,大部分的程序代碼和大多數文件數據都已經坐在page cache(和內核不需要任何磁盤I/O,讓他們到RAM中)

如果您在運行您自己的代碼之前對其依次讀取的大文件運行其他程序(如catwc),您可能會觀察到類似的加速。

又見posix_fadvise(2)sync(2) &特定Linux的readahead(2) & http://www.linuxatemyram.com/;在運行程序測量內存之前,期間和之後使用free(1)命令。另請閱讀proc(5),因爲/proc/包含很多有用的僞文件,描述了您的機器或您的進程的內核狀態。

也可以使用time(1),或許作爲/usr/bin/time -v,以基準幾次您的程序。另請參閱time(7) & getrusage(2) ...

+0

實際上,我可以看到額外1GB的帶有空閒命令的RAM,但不能與系統監視器應用程序一起使用。謝謝 :) –

相關問題