2012-11-13 107 views
0

我的C程序使用排序運行速度比其他時間慢10倍。它使用整數文件進行排序,即使我改變了數字,程序仍然運行得更快。當我重新啓動PC時,第一次程序運行速度慢了10倍。我用time來計算時間。爲什麼第一次運行C程序,運行速度慢了10倍

+4

也許文件被緩存? – imreal

+1

這是在Linux上?如果是這樣,它可能會將程序信息存儲在不活動的內存中,從而使下一次啓動更加高效。也就是說,如果內存沒有被動態分配 – thatidiotguy

+1

可以肯定的是,創建2個文件,然後用另一個運行程序。 – imreal

回答

13

即使不再需要操作系統(這稱爲「緩存」),操作系統會將數據保存在RAM中,因此當程序再次運行時,它會從該處獲取所有數據,並且沒有磁盤I/O。即使您更改數據,該更改也會先發生在RAM中,並且即使在寫入該文件後,它也會保留在那裏。

儘管如此,它並沒有留在RAM中,請注意。如果其他內容需要內存,緩存將被刪除。此時需要進行磁盤訪問(並在此時再次將其緩存到RAM中)。

這就是爲什麼重新啓動後第一次訪問總是很慢;數據還沒有被緩存,因爲它從來沒有從文件中讀取。

+0

但是輸入文件是隨機生成的,具有相同數量的數據,而且時間相似,爲什麼會這樣呢?另外,當我使用不同數量的文件生成數據時,第一次運行它的時間比其他時間大。 –

+0

@hey但不是10倍大,對吧? –

+0

什麼不是10倍大? –

2

你必須做出假設並將它們與現實對抗。你可以合理地做出的第一件事是它聞起來像一個緩存問題!

問自己這些問題:

  • 是否在免費RAM我的數據擬合(=我的文件由OS FS高速緩存 ?)
  • 難道我的數據,CPU數據緩存適合?
  • 我的數據是否適合HDD內部緩存?

    1. 丟棄最容易的假設是FS緩存。在linux下,每次調用您的程序時只需發出sync; echo 3 > /proc/sys/vm/drop_caches。第一個將確保緩存的數據將使其進入物理介質(硬盤驅動器),第二個將從內存中刪除文件系統緩存的內容。

    2. 的「物理介質」可能是硬盤緩存本身,所以要小心......在Linux下你可以,如果你與驅動sda正與命令hdparm -W 0 <device>禁用此「回寫」高速緩衝存儲器,例如,hdparm -W 0 /dev/sda將完成這項工作。您可能需要你與你的測試:)

    3. 另一種假設是CPU緩存結束後重新啓用它,看看How can I do a CPU cache flush in x86 Windows?How to clear CPU L1 and L2 cache

那麼,它可能或者可能不是其中之一,但它不會傷害嘗試:)

0

這不是什麼新鮮事,不只是你的程序很多流行的商業軟件都面臨這個問題。

首先檢查這個MATLAB Article about slow fist time execution

在其他編程語言的情況下,運行在如C#或Java虛擬機,這是很常見的。 http://en.wikipedia.org/wiki/Just-in-time_compilation#Startup_delay_and_optimizations

緩存是在C中發生的一個很好的原因,但仍然是10x是相當長的時間。重新啓動後,系統也可能正在加載其他資源。

您應該在重啓後10分鐘後運行程序以獲得更好的結果。所有的啓動應用程序將在那個時候加載。 (10分鐘----取決於啓動應用程序的數量和需要啓動他們每個人的時間)

0

如果你的程序做網絡接入那麼這可能是初始延遲的原因。許多網絡協議需要時間來設置。一些例子:

  • DNS:如果你的程序沒有任何網絡訪問,機會是它需要主機名解析爲IP地址。第一次至少需要網絡往返才能填充本地緩存。以下要求會更短。網絡文件系統(NFS,CIFS和其他):打開文件可以通過網絡進行。
  • 即使一些看似無害的庫函數也需要網絡訪問:主機的用戶列表可以位於遠程目錄服務器上。

從這個公寓你可以使用一些低級別的追蹤工具,看看時間花在哪裏。在Linux上,基本工具是strace -r。其他系統可能有一些類似的工具。您的編譯器還必須附帶一個分析器(即用於GCC或Valgrind的gprof)。

0

這是因爲編譯器optimatization的,它的作用是緩存結果爲Temoparal Locality和活動記錄保存,時間也省了,因爲綁定對象DONOT必須鏈接舞臺

0

有中重新裝入由兩個部分組成測量

如果要從磁盤讀取的文件,並且在存儲器中加載它的時間 - 和排序:

1)時間來讀取文件&存儲它在陣列 2)時間分類

這些是分別測量的嗎?

你能檢查一下嗎? Invalidating Linux Buffer Cache

而不是重新開始,如果重複實驗並清除緩存給出相同的結果,那麼您可以推斷文件緩衝區緩存效果未被考慮進去。

相關問題