我正在爲自己寫一個C++程序。在開始的時候,我一直讀到底部的文件,之後,在程序結束之前,我需要從開始時再讀取該文件。
我的問題是,在執行過程中打開文件(甚至認爲我不會使用它)效率更高,並且在我再次需要時將它倒回,或者我應該在第一次關閉它時當我需要時再打開它?
編輯:爲了澄清,我的問題不僅與我正在處理的具體項目有關。它非常小(少於300行代碼),所以不會有明顯的性能差異。我一般詢問打開,關閉和「倒帶」文件,所以它適用於其他大型項目,性能和內存實際上可能很重要倒帶文件比關閉文件並再次打開文件效率更高?
回答
如果關閉並打開文件,操作系統肯定需要更新系統鎖定文件和進程資源(打開的文件)的列表。此外關閉和開放操作是兩個systems calls (kernel calls)和系統調用並不便宜。每個系統調用都需要翻譯虛擬地址。
關閉文件可以(如果有任何改變)強制將緩存寫入硬盤,這意味着尋找時間約15ms(盤片的物理移動)。在網絡驅動的情況下可能會更糟糕。
關閉文件後,需要更新一些屬性。 FileSystem觀察器可能會啓動。
關閉文件後可能會觸發防病毒掃描,這取決於文件名,路徑,防病毒品牌。
此外關閉文件是一個風險,你不能因爲另一個進程再次打開它。例如Dropbox在更改後讀取Dropbox文件夾中的每個文件。因此,關閉和打開文件通常不會在Dropbox文件夾中工作(Dropbox可能會更快)。誰知道用戶如何使用你的應用程序。用戶具有創造性,他們共享你沒有想到的文件。
您可能能夠測量一小部分獲得的效率如果你fseek
到文件的開頭幾納秒,但我不認爲這是值得的,當你只處理單個文件。
像其他人一樣說:嘗試找到其他您可以優化的代碼區域。
確實。如果最終的速度是目標,文件很小,只需將內容保存在內存中。如果文件太大而無法保存在內存中,保持文件打開與重新打開文件之間的性能差異幾乎肯定會小於文件讀取速度的隨機波動。 –
然而,根據具體情況,在第二次通過期間,爲了降低錯誤風險,可能值得保留檔案。另外作爲最近進行I/O優化的Windows開發人員,我擔心「幾納秒」可能比慷慨的估計更多(我記錄的最佳訪問時間大約爲30μs)。 – doynax
與所有性能問題一樣,最終的優化差別很大。根據合理的數據集衡量兩種實現並從中獲取。
作爲一種設計選擇,一旦第一次讀取文件後,將文件內容緩存在內存中可能會更簡單,然後不需要重新讀取內容。如果再次需要修改的內容,則緩存修改的數據以放棄第二次讀取。
- 1. WinRT:關閉後再次打開之前打開的文件
- 2. 打開Excel文件,並在批處理文件然後再將它關閉
- 3. c#更多文件讀取比。更多的文件打開/關閉速度
- 4. 更高效:打開(文件,「wb」):通過或os.remove(文件)
- 5. boost :: log關閉日誌文件並打開一個新文件
- 6. 多次流關閉並打開相同的文件錯誤
- 7. 關閉讀取文件並打開才能寫出搜索結果字符串輸出文件再次要求
- 8. 我需要後再次關閉文件開放文件FP在Python
- 9. 將.class文件轉換爲smali文件並再次打包.apk
- 10. 批處理文件 - 關閉打開的文本文件
- 11. 文件打開追加效率降低與文件大小
- 12. 打開/關閉文件多次或一勞永逸效果更好嗎?
- 13. 打開帶有文件名「=」的文件
- 14. MySQL比文件系統更高效嗎?
- 15. 從php文檔打開文件,並從另一個關閉它?
- 16. 需要批處理文件才能一次打開一個文件夾中的所有.XLSM文件(前一次關閉後再打開)
- 17. 關閉打開的h5py數據文件
- 18. 文件打開和關閉在Python
- 19. 使用C關閉打開的文件
- 20. 如何關閉打開的文件?
- 21. XMLStreamReader的不關閉打開XML文件
- 22. Haskell惰性打開和關閉文件
- 23. 打開文件時總是關閉
- 24. 不能打開關閉的文件
- 25. 重新打開關閉的文件:Lua
- 26. 無效synax關閉文件
- 27. 防止文件關聯再次打開應用程序
- 28. 在OMEdit中打開多個文件時關閉一個文件
- 29. 關閉訪問文件夾,但打開文件
- 30. 記錄打開文件調試「ResourceWarning:未關閉的文件」
如果您有一種方法,您是否嘗試過兩種方法並測試了所花費的時間? –
優化C++代碼的第一條規則:衡量一切。 –
如果你沒有使用這個文件,你應該關閉它,這樣你就不會捆綁它了。 – NathanOliver