2012-02-23 109 views
1

只需使用MSVC++ input.getline()來讀取一個非常大的(3GB)分隔文本文件之前,我想以優化速度,增加輸入緩衝區的大小:在執行時增加緩衝提高了ifstream.getline()在C++中的最高速度嗎?

ifstream input("in1.txt"); 
    input.rdbuf()->pubsetbuf(NULL, 1024 * 1024); 

然而,代碼,速度沒有提高,所以我想知道:

  • 代碼有什麼問題?
  • 緩衝是否適用於ifstream.getline?
  • 分配給ifstream的默認緩衝大小是多少?

問候。

+2

的[什麼是高性能順序文件I/O在C++?最快的方法]可能重複(http://stackoverflow.com/questions/1201261/what-is-the-fastest-method-for-high -performance-sequential-file-io-in-c)和[最快的方法來逐行讀取字符串的文本文件](http://stackoverflow.com/questions/9356216/fastest-way-to-read-a字符串一行一行的文本文件) – 2012-02-23 21:18:32

回答

0

關於緩衝的一點是它可以在很多層次上運行,你有庫(ifstream)級別的緩衝,你有OS級別的緩衝和硬件級別的緩衝。改變其中任何一個的大小可能會對性能產生重大或不存在的影響。

事實是,程序的'邏輯'將比IO的'邏輯'快得多。

個人,除非瓶頸是嚴重的,我會離開它。

+1

「程序的'邏輯'將比IO的'邏輯'快得多」這是一個常見的假設,即沒有人測試過。他們只是用它作爲不讓I/O更快的藉口。由於從不擔心I/O性能,它確實非常慢。 – 2012-02-23 21:19:26

+0

@BenVoigt:+1我同意!隨着市場上10g和40g網卡的崛起,I/O事實上飽和了CPU,「邏輯」迅速成爲瓶頸,而「邏輯」內輸入的啞/低效率處理是最緩慢的原因。 – 2012-11-11 22:30:38

-1

我想優化速度

擺脫fstream。一般來說,流媒體是一個可怕的瓶頸。

+0

本,我被說服由谷歌測試,C++是最快的語言,當然,也包括STL :-( – vizcayno 2012-02-23 22:46:57

+0

@ user255053:我嚴重懷疑你使用STL,即使你是,輸入輸出流從未它。的C++標準庫的一部分可能會或可能不會得到很好的優化,取決於實施和你使用的特定部分。 – 2012-02-23 23:00:34

3

您是否考慮過mmap()系統調用?

的MMAP()函數應建立共享存儲器的對象類型的存儲器 對象的處理 地址空間和文件之間的映射,或。通話格式如下:

pa = mmap(addr,len,prot,flags,fildes,off);

man page

MapViewOfFile是windows等效。

LPVOID WINAPI MapViewOfFile(__in HANDLE hFileMappingObject,
__in DWORD dwDesiredAccess,__in DWORD dwFileOffsetHigh,__in DWORD dwFileOffsetLow,__in SIZE_T dwNumberOfBytesToMap);

+0

艾夫斯,感謝您的幫助!雖然窗口的代碼看起來可怕,非常接近到C 。我不相信用STL提高速度是不可能的。 – vizcayno 2012-02-23 22:55:46

0

通過使用CreateFile和ReadFile,您將獲得絕對最快的性能。使用FILE_FLAGS_SEQUENTIAL_SCAN打開文件。

使用2的冪來讀取緩衝區大小。只有基準可以確定這個數字。我已經看到它是8K一次。另一次我發現它是8M!這個變化很大。

它取決於CPU高速緩存的大小,操作系統預讀的效率以及與執行許多小寫操作相關的開銷。

內存映射的最快方式。它有更多的開銷,因爲您無法控制塊大小,並且操作系統需要在所有頁面中出錯。

+0

但是請參閱http://stackoverflow.com/q/5257019/103167 – 2012-02-23 23:02:30

+0

接受的答案解釋了爲什麼會這樣,他也沒有使用FILE_FLAG_SEQUENTIAL_SCAN。 – usr 2012-02-23 23:08:56

+0

是的,我告訴他,在評論中,但這是MapViewOfFile'進行相當多的比'FILE_FLAG_NO_BUFF快的事實ERING'表明,內存映射要麼比'ReadFile'更有效率,可能是因爲不需要將所有內容從緩存複製到應用所擁有的私有頁面,否則內存映射就會預取它自己的內存(這是在這個問題中關閉了'ReadFile'),或者兩者都有。 – 2012-02-23 23:13:13

0

您可以嘗試使用操作系統提供的內存映射文件的功能,或者,如果內存是不是一個問題,請嘗試讀取整個文件到內存中處理之前。