要将许多数据写入文件,我有2种方法:
ofstream file("c:\\test.txt");
for (int i = 0; i < 10000; ++i)
{
file << data[i];
}
ostringstream strstream;
for (int i = 0; i < 10000; ++i)
{
strstream << data[i];
}
ofstream file("c:\\test.txt");
file << strstream.str();
毫不奇怪,第二种方法更快,实际上,它比我的HP7800机器上的第一种方法快4倍。
但为什么?我知道ofstream在内部使用filebuf,而ostringstream在使用stringbuf-作为缓冲区,它们应该全部驻留在内存中,因此应该没有区别。
引擎盖下有什么区别?
最佳答案
您是否在使用std::endl
而不是'\n'
? std::endl
有两件事:将'\n'
插入流中,然后将缓冲区刷新到磁盘。我见过这样的代码会严重降低性能。 (修复该代码后,其运行速度提高了5到10倍。)
刷新到字符串缓冲区比刷新到磁盘要快得多,因此可以解释您的发现。
如果不是这种情况,您可能会考虑增加缓冲区大小:
const std::size_t buf_size = 32768;
char my_buffer[buf_size];
ofstream file("c:\\test.txt");
file.rdbuf()->pubsetbuf(my_buffer, buf_size);
for (int i = 0; i < 10000; ++i)
{
file << data[i];
}
关于c++ - 为什么ostringstream比ofstream快,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5192239/