2015-04-28 122 views
1

我正在使用FIFO與一些並行進程進行通信。我正在用read()讀取管道。我正在通過這樣寫入命名管道:改善ofstream的性能?

ofstream pipe(namepipe); 

pipe << data << endl; 
pipe.close(); 

我一直注意到性能是可怕的!有時需要40ms。我認爲這是一個極端的延遲。我讀過使用std :: endl會影響性能。我應該避免使用endl嗎?

使用ofstream是否會影響性能?這種方法還有其他的選擇嗎?

謝謝!

回答

0

一個廉價的破解:

std::ios::sync_with_stdio(false); 

注意使用這個只有當你不打算將混合c IO與c++

原因std::endl可能會影響I/O性能是因爲它沖刷流。因此,爲了避免這種情況,你應該使用'\n'

避免不必打開和關閉多個流也將有助於

+0

我雖然混合他們。我正在使用從我認爲的read()。我在一個線程中使用了它,而在主線程中使用了C++ iostream。我仍然應該使用std :: ios :: sync_with_stdio(false);? –

+0

@LuisCruz,如果你這樣做,那麼你不應該使用該建議。另外,我會建議你用C做所有IO,而不是混合兩者。或者完全切換到C++ IO,因爲您仍然可以在C++中執行相同的操作。請參閱[閱讀](http://www.cplusplus.com/reference/istream/istream/read/),然後您可以使用我已經顯示的優化 – smac89

0

當使用大型文件與fstream,確保使用流緩衝和Don」 t使用endlendl刷新輸出流)。

至少MSVC執行拷貝1字符同時時設置沒有緩衝的filebuf(見streambuf::xsputn()),它可以使你的應用程序CPU綁定,這將導致較低的I/O速率。

所以,儘量做寫之前添加以下內容到代碼:

const size_t bufsize = 256*1024; 
char buf[bufsize]; 
mystream.rdbuf()->pubsetbuf(buf, bufsize); 

NB:你可以找到一個完整的示例應用程序here