C 怎樣讀取檔案才有最快的速度?

時間 2021-05-12 15:57:01

1樓:Pluto Hades

充分利用作業系統的Map和Cache機制,不同系統不太一樣

順便說一下,不做任何引數改變,只使用預設方式,Windows上使用C庫的fread和C++的fstream要比單純的WinAPI Readfile慢得多。WinCE更加顯著。

2樓:龔佶敏

問題好大啊,可以寫一本書了,呵呵。快是指延時低還是頻寬大?

c++只是一種語言,具體平台不同,實現方式好多差異。有的場景下適合並行,有的場景不適合,有的場景適合預讀,有的場景不適合。除非深入交流,才能有更具體的答案。

3樓:孫朝陽

這個問題要結合怎麼消費檔案才能給出合理的答案。

對於相對大塊的順序讀,各種方法效能差距常常並不很大。但是,對於反序列化,夾雜本地化,不同的讀方式可能導致巨大的效能差異。

舉兩個例子。

基於fread直接實現反序列化,這導致大量的api呼叫。如果用mmap或每次預先fread一大塊資料到記憶體,基於這個記憶體做反序列化,出現數量級的效能提公升是可能的。

在某種格式的檔案中反向搜尋特定的signature。直接調fseek,再fread會慢到死,必須加以處理。雖然fread和mmap都能用於讀取大塊資料到記憶體,但方便性上還是各有所長。

4樓:nekocode

節選並重新排版自:探尋C++最快的讀取檔案的方案

為確保準確性,我又換到Windows平台上測試了一下。結果如下表:

從上面可以看出幾個問題

Linux 平台上執行程式普遍比 Windows 上快。

Windows 下 VC 編譯的程式一般執行比 MINGW(MINimal Gcc for Windows)快。

VC 對 cin 取消同步與否不敏感,前後效率相同。反過來 MINGW 則非常敏感,前後效率相差8倍

read 本是 linux 系統函式,MINGW 可能採用了某種模擬方式,read 比 fread 更慢。

Pascal 程式執行速度實在令人不敢恭維。

好像黑了不少東西 :) 個人意見是大檔案的話使用 fread,不考慮效率以及記憶體占用的話可以考慮 fstream。example:高效地讀取&解析檔案(fread)

5樓:劉俊是

std::ifstream

ifs(

"Title.pic"

,std

::ios

::binary

);std

::vector

>buffer

;buffer

.assign

(std

::istreambuf_iterator<

char

>(ifs

),std

::istreambuf_iterator<

char

>());

std::

ifstream

ifs(

"Title.pic"

,std

::ios

::binary

);std

::vector

>buffer

;buffer

.resize

(ifs

.seekg(0

,std

::ios

::end

).tellg

());

ifs.

seekg(0

,std

::ios

::beg

).read(&

buffer[0

],static_cast

streamsize

>(buffer

.size

()));

後面是前面的20倍

6樓:

大部分情況下,該怎麼讀就怎麼讀,kernel裡有相應的預讀機制。

mmap雖然可以少一次記憶體copy,但mmap的預讀演算法是read around,也就是說,預設情況下,當你用mmap讀乙個檔案的時候,讀第1000個位元組,kernel事實上會讀取該檔案900 - 1100個位元組(具體數字事實上是若干個page大小)。而非同步預讀則預設不啟用,因為mmap大多數時候是隨機讀寫,kernel不知道該讀取哪部分資料。

而read系統呼叫,其預設預讀演算法是readahead,也就是講,你讀第1000個位元組的時候,kernel會讀取1000 - 1200個位元組(具體數字也是若干個page)。並且一直非同步預讀後面的資料,直到把空閒記憶體填滿或達到某個閾值。所以,理論上read在順序讀取的時候效率比mmap要高。

也就是說,mmap的預設行為是為隨機讀寫優化的,read的預設行為是為順序讀寫優化的。當然,你也可以用madvise/fadvise去修改這些行為以及調優預讀引數。

7樓:姚冬

檔案讀取的速度極限就是硬碟的讀速度上限,想要達到硬碟的讀速度上限就要設法不讓硬碟停下來,讓它一直讀。

對於磁碟,要保證檔案是連續儲存的,減少尋道時間,減少磁頭的移動次數。

充分利用快取的機制,硬碟在響應讀請求的時候會預讀取一部分資料到快取,下次讀取就從快取拿不去真正訪問硬碟,所以每次讀請求的資料量要比快取大,這樣才不會讓硬碟閒置。

如果OS支援非同步IO就用非同步的,pending一堆讀請求,目的就是不讓硬碟閒著。

在單獨的執行緒處理讀取到的資料,必要時開多個執行緒,保證處理速度遠遠快於讀取速度。

如果許可權夠,可以繞過檔案系統直接讀取物理磁碟。

軟體能做的也就這些了,再提高速度只能公升級硬體了。

8樓:黃亮anthony

對於不大的檔案(小於1M),建議一次性讀取,較大的檔案建議使用記憶體對映。

C++有乙個成例,讀取文字檔案為字串(二進位制檔案需要一些技巧),我認為比較快。

ifstream in("filename");

ostringstream out;

out << in.buf(); //關鍵,直接讀取bufout.str(); //輸出字串。

記憶體對映可以使用boost庫。

c 從檔案流讀取資料放入vector是否有更好的辦法

杜紫童 struct data while fs.eoffs d i d f d s 如何將流輸入為引數 v.emplace back fs 糾結這一次拷貝是吧。跟我當時乙個樣。一種優雅的做法 給vector內的data型別實現一下流輸入運算子 operator 然後因為fstream有繼承自ist...

如何程式設計讀取EXCEL檔案?

關於Python的庫推薦有以下 Python excel xlrd,xlwt,xlutils Python Excel Openpyxl openpyxl A Python library to read write Excel 2007 xlsx xlsm files pywin32 COM Py...

怎樣用fortran讀取檔案至多個陣列?

program test implicit none integer i real allocatable dimension data ini real dimension 120 data sum 這塊有不同 allocate data ini 10 10,120 data ini 1.data...