簡體   English   中英

用C ++讀取文件

[英]Reading a file in C++

我正在編寫應用程序來監視文件,然后匹配該文件中的某些模式。 我想知道用C ++讀取文件最快的方法是逐行讀取更快,讀取文件塊更快。

您的問題更多是關於硬件,操作系統和運行時庫的性能,而不是與編程語言有關。 當您開始讀取文件時,由於文件是以這種方式存儲在磁盤上的,因此操作系統可能無論如何都以塊的形式加載文件,這對於操作系統來說,在首次訪問時完全加載每個塊並進行緩存而不是讀取塊是有意義的,提取請求的數據並丟棄其余數據。

哪個更快? 一次一行還是一行? 與這些事情一樣,答案並不是您可以預測的,要確定的唯一方法就是編寫逐行版本和一次塊的版本並對其進行概要分析(測量其持續時間)。每個版本)。

您可以嘗試使用內存映射文件將文件直接映射到內存,然后使用標准C ++邏輯查找所需的模式。

通常,將大量文件讀入緩沖區,然后解析緩沖區要比讀取單獨的行快得多。 實際的證明是先逐行讀取配置文件代碼,然后再在大型緩沖區中讀取配置文件代碼。 比較配置文件。

這種辯解的基礎是:

  • 減少I / O交易
  • 保持硬盤旋轉
  • 解析內存更快

通過應用這些技術,我將一個應用程序的性能從65分鍾降低到2分鍾。

減少I / O交易
減少I / O事務導致對操作系統的調用很少,從而減少了時間。 減少代碼中的分支數量; 改善處理器中指令流水線的性能。 並且還減少了硬盤驅動器的流量。 硬盤驅動器需要處理的命令較少,因此開銷也較小。

保持硬盤驅動器旋轉要訪問文件,硬盤驅動器必須將電動機提升到適當的速度(這需要時間),將磁頭定位到所需的軌道和扇區,然后讀取數據。 定位磁頭並傾斜電動機是所有事務所需的管理時間。 讀取數據的開銷很小。 目的是在一個事務中讀取盡可能多的數據,因為這是硬盤驅動器最有效的地方。 減少交易數量將減少等待時間,以增加電動機和定位磁頭。

盡管現代計算機同時具有數據和命令的緩存,但減少數量將加快處理速度。 較大的“有效負載”將允許更有效地使用其緩存,而不需要對請求進行排序的開銷。

解析內存更快
通常,從內存中讀取要比從外部源中讀取更快。 從緩沖區讀取第二行文本需要增加一個指針。 從文件讀取第二行需要I / O事務才能將數據存入內存。 如果您的程序有可用內存,請將數據拖到內存中,然后搜索內存。

太多數據否定了性能節省
計算機上有有限數量的RAM供應用程序共享。 訪問比此內存更多的內存可能會導致計算機“分頁”或將請求轉發到硬盤驅動器(稱為虛擬內存 )。 在這種情況下,可能幾乎沒有任何節省,因為無論如何(在程序不了解的情況下,操作系統都可以訪問)硬盤驅動器。 通過分析可以很好地指示數據緩沖區的最佳大小。

我優化的應用程序一次從2 GB的文件中讀取一個字節。 當我將程序更改為讀取1 MB的數據塊時,性能大大提高。 這還允許通過循環展開來提高性能。

希望這可以幫助。

操作系統(甚至您使用的C ++類)可能會分塊讀取文件並將其緩存,即使您逐行讀取文件以提高將磁盤訪問最小化的性能(從操作系統的角度來看,這樣做也會更快)從內存緩沖區讀取數據而不是從硬盤設備讀取數據)。

請注意,提高程序性能(如果它確實是時間緊迫的)的一種好方法是減少對操作系統功能(管理其資源)的調用次數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM