提高ofstream的性能?

10 浏览
0 Comments

提高ofstream的性能?

我正在使用FIFO与一些并行进程进行通信。我使用read()读取管道。我通过以下方式向命名管道写入数据:

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

然而,我发现性能非常糟糕!有时候需要40毫秒。我认为这是极端的延迟。我读到说使用std::endl可能会影响性能。我应该避免使用endl吗?

使用ofstream会影响性能吗?还有其他替代方法吗?

谢谢!

0
0 Comments

当使用fstream处理大文件时,确保使用流缓冲区,并且不要使用endl(endl会刷新输出流)。

至少在MSVC实现中,当没有设置缓冲区时(参见streambuf::xsputn()),每次复制一个字符到filebuf,这可能使得应用程序受限于CPU,从而导致较低的I/O速率。

因此,在进行写入之前,请尝试将以下内容添加到您的代码中:

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

NB: 您可以在这里找到一个完整的示例应用程序。

0
0 Comments

问题出现的原因是使用std::endl导致i/o性能下降,因为它会刷新流。为了避免这个问题,应该使用'\n'来代替std::endl。此外,避免打开和关闭多个流也会有帮助。

解决方法是使用std::ios::sync_with_stdio(false)来提高性能。但需要注意的是,如果在代码中同时混合使用了c IO和c++ IO,则不应该使用这个方法。如果在线程中使用了read()函数,而主线程中使用了C++的iostream,则也不建议使用这个方法。

另一种解决方法是完全使用C语言的IO,或者完全切换到C++ IO。在C++中可以使用read函数来实现相同的功能,并且可以利用优化来提高性能。

0