2015-10-14 99 views
3

我正在爲自己寫一個C++程序。在開始的時候,我一直讀到底部的文件,之後,在程序結束之前,我需要從開始時再讀取該文件。

我的問題是,在執行過程中打開文件(甚至認爲我不會使用它)效率更高,並且在我再次需要時將它倒回,或者我應該在第一次關閉它時當我需要時再打開它?

編輯:爲了澄清,我的問題不僅與我正在處理的具體項目有關。它非常小(少於300行代碼),所以不會有明顯的性能差異。我一般詢問打開,關閉和「倒帶」文件,所以它適用於其他大型項目,性能和內存實際上可能很重要倒帶文件比關閉文件並再次打開文件效率更高?

+2

如果您有一種方法,您是否嘗試過兩種方法並測試了所花費的時間? –

+5

優化C++代碼的第一條規則:衡量一切。 –

+0

如果你沒有使用這個文件,你應該關閉它,這樣你就不會捆綁它了。 – NathanOliver

回答

1

如果關閉並打開文件,操作系統肯定需要更新系統鎖定文件和進程資源(打開的文件)的列表。此外關閉和開放操作是兩個systems calls (kernel calls)和系統調用並不便宜。每個系統調用都需要翻譯虛擬地址。

關閉文件可以(如果有任何改變)強制將緩存寫入硬盤,這意味着尋找時間約15ms(盤片的物理移動)。在網絡驅動的情況下可能會更糟糕。

關閉文件後,需要更新一些屬性。 FileSystem觀察器可能會啓動。

關閉文件後可能會觸發防病毒掃描,這取決於文件名,路徑,防病毒品牌。

此外關閉文件是一個風險,你不能因爲另一個進程再次打開它。例如Dropbox在更改後讀取Dropbox文件夾中的每個文件。因此,關閉和打開文件通常不會在Dropbox文件夾中工作(Dropbox可能會更快)。誰知道用戶如何使用你的應用程序。用戶具有創造性,他們共享你沒有想到的文件。

3

您可能能夠測量一小部分獲得的效率如果你fseek到文件的開頭幾納秒,但我不認爲這是值得的,當你只處理單個文件。

像其他人一樣說:嘗試找到其他您可以優化的代碼區域。

+0

確實。如果最終的速度是目標,文件很小,只需將內容保存在內存中。如果文件太大而無法保存在內存中,保持文件打開與重新打開文件之間的性能差異幾乎肯定會小於文件讀取速度的隨機波動。 –

+1

然而,根據具體情況,在第二次通過期間,爲了降低錯誤風險,可能值得保留檔案。另外作爲最近進行I/O優化的Windows開發人員,我擔心「幾納秒」可能比慷慨的估計更多(我記錄的最佳訪問時間大約爲30μs)。 – doynax

0

與所有性能問題一樣,最終的優化差別很大。根據合理的數據集衡量兩種實現並從中獲取。

作爲一種設計選擇,一旦第一次讀取文件後,將文件內容緩存在內存中可能會更簡單,然後不需要重新讀取內容。如果再次需要修改的內容,則緩存修改的數據以放棄第二次讀取。

相關問題