2013-03-14 52 views
0

我寫了一個加載文件的程序,我想知道是否有人可以解釋爲什麼加載文件的第二個&後續時間比初始加載相同的文件更快?
例如:
1.首次加載大文件(500MB)時,所花費的時間比後續加載相同文件的時間要長。加載文件時只需要幾分之一的時間。
即使內存使用量在兩者之間下降(這種情況在重新啓動程序時也會出現),情況就是如此。

2.如果我重新啓動我的電腦和/或不運行程序或在一段時間後重新加載文件,情況#1再次發生。內存和文件加載c + +?

環境:

  • C++
  • VS 2010(MFC)
  • Windows XP家庭32位
  • 文件加載: 我試過FREAD()&別人,但他們都最終獲得類似的結果。

感謝您的任何見解。

+0

我不確定,雖然問題的原因對我來說很明顯。它也被關閉爲「脫離主題」 - 並且「不是問題」。哦,我想缺乏問號可能是相關的。 – 2013-03-14 23:58:30

+0

是的,地球上升和設置,但人們仍然說日落和日出。可能是顯而易見的,但其他人可能不會。沒有這樣的事情,愚蠢的問題哈哈。無論如何,我很欣賞那些已經回答的問題。歡呼聲:) – ReturnVoid 2013-03-15 00:03:09

+0

是的,並不是說答案顯而易見,但對我來說很明顯。我想也許這被一些人認爲是「太明顯」了?也許? (在你的問題中編輯一個問號。)(另外,地球也不會上升或下降,它會旋轉) – 2013-03-15 00:08:42

回答

5

您的操作系統會將文件緩存在未使用的內存中。見wikipedia。這將在重新啓動後消失,或者如果使用大量內存,或者打開更多文件。細節取決於您的操作系統。

對於現代計算機體系結構的更廣泛概述,Herb Sutter的this talk是很好的。

+0

認爲這樣的事情可能是如此,但不確定。感謝您的鏈接。有沒有什麼辦法在加載之前緩存文件或類似的東西來加速文件加載? – ReturnVoid 2013-03-14 22:32:27

+0

您可以通過以〜=頁面大小的間隔尋找並讀取它來欺騙它,但是您的操作系統可能決定不緩存它或在使用它之前將它踢出去。在Linux上,最好的選擇可能是製作一張RAM磁盤並將其複製到其中。 – 2013-03-14 22:39:59

+0

很明顯,我應該補充一下,第一次加載文件所需的時間是將它加載到緩存中的成本 - 你不能讓它消失:)你可以通過異步加載文件來隱藏延遲其他的東西,但是。 (這是另一個問題:)) – 2013-03-14 22:48:38

1

一個可能的解釋是您的硬盤可能有緩存。你第一次讀這個文件時,你直接從盤片上讀到它。下一次,驅動器可以從緩存中提供它。延遲(或重新啓動)之後,文件的內容不再存在於緩存中,因此它會再次從盤片中提取。

+3

典型硬盤上的高速緩存大約爲32MB(對於固態硬盤來說更多)。這一點非常重要,它可能在第二次加載時甚至沒有達到。它可能被操作系統緩存在RAM中。 – 2013-03-14 22:16:44

+1

好點。 +1在你的答案。 – 2013-03-14 22:18:36

0

現在大多數硬盤驅動器都有緩存,所以一旦你加載一次,它就在緩存中。您可能不想多次加載文件!

+0

它可能不是硬盤緩存,這是節省。 – 2013-03-15 00:01:55

1

在現代操作系統中,沒有「未使用的內存」之類的東西。那完全是浪費。操作系統所做的工作是保存文件,目錄結構,文件元數據(例如磁盤上給定文件的數據所在的位置)的副本以及「未使用」內存中的其他有用數據。

所以當你讀一個文件時,它會被加載到內存中。假設有足夠的「未使用」內存,該文件確實會在那裏呆很久。最終它可能會被踢出去,因爲在你的計算機的正常使用中,電子郵件軟件,網頁瀏覽器,文件內容索引器,反病毒掃描器,網絡時間同步器,地址簿到手機同步器以及所有其他後臺代碼在你的系統中運行,所有這些東西都會佔用一點「未使用」的內存。

所以,是的,文件被緩存。系統中的500MB文件具有4或8GB的RAM並且不使用所有的RAM,可能會在那裏停留數分鐘,數小時甚至數天。