我正在使用FIFO與一些並行進程進行通信。我正在用read()讀取管道。我正在通過這樣寫入命名管道:改善ofstream的性能?
ofstream pipe(namepipe);
pipe << data << endl;
pipe.close();
我一直注意到性能是可怕的!有時需要40ms。我認爲這是一個極端的延遲。我讀過使用std :: endl會影響性能。我應該避免使用endl嗎?
使用ofstream是否會影響性能?這種方法還有其他的選擇嗎?
謝謝!
我正在使用FIFO與一些並行進程進行通信。我正在用read()讀取管道。我正在通過這樣寫入命名管道:改善ofstream的性能?
ofstream pipe(namepipe);
pipe << data << endl;
pipe.close();
我一直注意到性能是可怕的!有時需要40ms。我認爲這是一個極端的延遲。我讀過使用std :: endl會影響性能。我應該避免使用endl嗎?
使用ofstream是否會影響性能?這種方法還有其他的選擇嗎?
謝謝!
一個廉價的破解:
std::ios::sync_with_stdio(false);
注意使用這個只有當你不打算將混合c
IO與c++
原因std::endl
可能會影響I/O性能是因爲它沖刷流。因此,爲了避免這種情況,你應該使用'\n'
避免不必打開和關閉多個流也將有助於
當使用大型文件與fstream
,確保使用流緩衝和Don」 t使用endl
(endl
刷新輸出流)。
至少MSVC執行拷貝1字符同時時設置沒有緩衝的filebuf
(見streambuf::xsputn()
),它可以使你的應用程序CPU綁定,這將導致較低的I/O速率。
所以,儘量做寫之前添加以下內容到代碼:
const size_t bufsize = 256*1024;
char buf[bufsize];
mystream.rdbuf()->pubsetbuf(buf, bufsize);
NB:你可以找到一個完整的示例應用程序here。
我雖然混合他們。我正在使用從我認爲的read()。我在一個線程中使用了它,而在主線程中使用了C++ iostream。我仍然應該使用std :: ios :: sync_with_stdio(false);? –
@LuisCruz,如果你這樣做,那麼你不應該使用該建議。另外,我會建議你用C做所有IO,而不是混合兩者。或者完全切換到C++ IO,因爲您仍然可以在C++中執行相同的操作。請參閱[閱讀](http://www.cplusplus.com/reference/istream/istream/read/),然後您可以使用我已經顯示的優化 – smac89