簡體   English   中英

讀取std :: string中的整個文件或使用std :: ifstream操作文件是否更好?

[英]Is it better to read an entire file in std::string or to manipulate a file with std::ifstream?

我實際上正在開發科學的C ++模擬程序,它們讀取數據,從中計算大量值,最后將結果存儲在文件中。 我想知道在程序開始時一次讀取所有數據是否比在程序期間通過std::ifstream訪問文件更快。

我使用的數據不是很大(幾MB),但我甚至不知道堆分配的“大”是什么...

我想這取決於數據等等(經過一些測試,實際上取決於它),但我想知道它取決於什么,以及是否有一種我們應該遵循的一般原則。

簡而言之,問題是:保持文件打開並使用文件操縱器是否比潛在的大堆分配和使用字符串操縱器更快?

看看mmap 此API允許您使用與RAM相同的分頁機制將文件描述符映射到地址空間。 這樣,您既可以獲得對數據的隨機訪問,又可以不必要地將不需要的數據復制到RAM中。

是否在程序開頭一次讀取所有數據比在程序期間通過std :: ifstream訪問文件更快? 是的,可能是。 請記住,工作內存快速且昂貴,而存儲內存(硬盤驅動器)的存在恰好是以便宜而代價慢。

堆分配的“大”是什么? 操作系統將試圖欺騙您的過程,使其認為所有現有的工作內存都是免費的。 實際上並非如此,如果某些進程請求太多內存,操作系統將為另一種類型“交換”一種類型的內存。 但原則上,如果堆分配與工作內存的總大小相當,則應該認為堆分配很大。

保持文件打開和使用文件操縱器是否比潛在的大堆分配和使用字符串操縱器更快? 不,它不是更快,但它還有另一個優點:它具有內存效率。 如果您只將所需的數據放入內存以便使用它們,那么您將為機器中的所有其他進程(例如,可能是程序的其他線程)保存內存。 這是一個非常有趣的屬性,以便擁有可擴展的軟件。

(預計這將被關閉,因為它是一個“基於意見”的問題。)

我的想法:

  1. 這聽起來像是過早的優化。 寫它是簡單的方法,然后優化,如果它太慢。
  2. 在內存中工作通常要快幾千倍。 堆分配根據分配的數量 ,而不是分配的大小放緩。 這聽起來並不像你正在使用大量數據。
  3. 如果你的文件是“幾MB”,那么操作系統可能會緩存它。

從大塊文件中讀取數據要比許多小尺寸的讀取請求快得多。 例如,1讀取10MB比10讀取1MB快。

當我優化文件I / O時,我將數據讀入uint8_t緩沖區,然后解析緩沖區。 使用此方法的一個問題是讀取文本文件。 文本編碼數據有可能跨越緩沖區邊界。 例如,每個文本行有4個數字,緩沖區中只有2個數字(或者只有2個數字位於緩沖區中)。 您必須編寫代碼來處理這些情況。

如果您將程序視為管道,您可以進一步優化。 您可以實現線程:讀取線程,處理線程和寫入(輸出)線程。 讀取線程讀入緩沖區。 當有足夠的數據進行處理時,讀取線程會喚醒處理線程。 處理線程處理讀取的數據,當有一些輸出時,它將它存儲到共享緩沖區並喚醒輸出線程。 因此,對於管道模型,數據通過讀取線程進入管道。 在管道中的某個點處,處理線程處理數據。 寫入線程從處理線程獲取數據並將其輸出(退出管道)。

此外,組織數據以使其適合處理器緩存行也將加快您的程序。

暫無
暫無

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

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