我的程序並行讀取數十個非常大的文件,每次只讀一行。看起來主要的性能瓶頸是硬盤從文件到文件的尋道時間(儘管我不完全確定如何驗證這一點),所以我認爲如果我可以緩衝輸入,速度會更快。如何用boost :: iostreams更改緩衝區大小?
我使用C++這樣的代碼,通過升壓來閱讀我的文件:: iostreams的「流過濾」:
input = new filtering_istream;
input->push(gzip_decompressor());
file_source in (fname);
input->push(in);
按照documentation,file_source
沒有任何辦法來設置緩衝區的大小,但filtering_stream ::推似乎:
void push(const T& t,
std::streamsize buffer_size,
std::streamsize pback_size);
所以,我想input->push(in, 1E9)
其實我心裏想程序的內存使用量飆升,但速度一點都沒有改變。
我只是錯了,讀緩衝會提高性能?或者我做錯了嗎?我可以直接緩衝一個file_source,還是我需要創建一個filtering_streambuf?如果後者,這是如何工作的?該文檔並不完全是例子。
也許這是另一個帖子的問題,但我將如何描述它?我知道如何使用gprof,但它只告訴我CPU時間,在這裏我很確定瓶頸是磁盤I/O。 或者如果有人能告訴我如何正確設置緩衝區大小,我可以試試看看是否有幫助。 – user387250 2010-07-10 02:07:19
@jwfoley:我喜歡[Valgrind's](http://valgrind.org/)callgrind分析器。就我的經驗而言(讀作:我不能保證任何事情),它也報告了在內核調用中花費的時間,這是我永遠無法獲得gprof所做的事情。例如,我用它來剖析一個使用OpenGL的應用程序,並正確報告在視頻驅動程序代碼中花費的時間。它非常易於使用(valgrind --tool = callgrind ./your-app)。使用[KCachegrind](http://kcachegrind.sourceforge.net/html/Home.html)解釋結果。唯一的問題是你的應用程序在分析時會運行20次左右。 – Staffan 2010-07-10 02:17:35
@Staffan:好的,我試過callgrind + KCachegrind,我對Profiler印象深刻,但我仍然不知道自己在找什麼。結果看起來很像gprof's。稱爲T.3577的東西有很高的「包含」。但低「自我」;大部分時間似乎都花在std :: basic_ios上。也許這就是磁盤I/O? 我仍然想回答我如何設置緩衝區大小的原始問題。如果這很容易,那麼我可以嘗試一下,看看它是否有幫助,但無論如何它都是有用的。 – user387250 2010-07-12 21:41:50