Bai*_*ang 10 c++ iostream filestream
要将许多数据写入文件,我有两种方法:
直接写入ofstream流
ofstream file("c:\\test.txt");
for (int i = 0; i < 10000; ++i)
{
file << data[i];
}
Run Code Online (Sandbox Code Playgroud)首先写入istringstream,然后立即写入ofstream
ostringstream strstream;
for (int i = 0; i < 10000; ++i)
{
strstream << data[i];
}
ofstream file("c:\\test.txt");
file << strstream.str();
Run Code Online (Sandbox Code Playgroud)毫不奇怪,第二种方法更快,事实上,它比我的HP7800机器上的第一种方法快4倍.
但为什么?我知道ofstream正在使用filebuf,而ostringstream正在使用stringbuf - 作为缓冲区,它们都应该驻留在内存中,因此应该没有区别.
引擎盖下有什么区别?
sbi*_*sbi 17
你使用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];
}
Run Code Online (Sandbox Code Playgroud)