【发布时间】:2012-10-11 10:02:56
【问题描述】:
我测试了两种书写配置:
-
Fstream 缓冲:
// Initialization const unsigned int length = 8192; char buffer[length]; std::ofstream stream; stream.rdbuf()->pubsetbuf(buffer, length); stream.open("test.dat", std::ios::binary | std::ios::trunc) // To write I use : stream.write(reinterpret_cast<char*>(&x), sizeof(x)); -
手动缓冲:
// Initialization const unsigned int length = 8192; char buffer[length]; std::ofstream stream("test.dat", std::ios::binary | std::ios::trunc); // Then I put manually the data in the buffer // To write I use : stream.write(buffer, length);
我期待同样的结果...
但是我的手动缓冲将性能提高了 10 倍以写入 100MB 的文件,并且 fstream 缓冲与正常情况相比没有任何改变(没有重新定义缓冲区)。
有人对这种情况有解释吗?
编辑: 这是新闻:刚刚在超级计算机上完成的基准测试(Linux 64 位架构,持续英特尔至强 8 核,Lustre 文件系统和......希望配置良好的编译器) (而且我没有解释 1kB 手动缓冲区“共振”的原因......)
编辑 2: 以及 1024 B 的共振(如果有人对此有想法,我很感兴趣):
【问题讨论】:
-
g++ 4.7.1 在 Ubuntu 12.04 上(在 Window 7 x64 pro 上的 VirtualBox 内),带有 SSD 磁盘。我将在超级计算机上进行测试,然后返回测试结果。
-
你能检查默认缓冲大小吗,比如这个问题:stackoverflow.com/questions/10350759/…
-
当然开启了优化?很抱歉这个问题,但是当有人谈论衡量性能并且没有说明平台或编译方法时,这总是首先要问的问题。
-
我建议你检查 C++ 库的源代码,看看它的作用取决于缓冲区。
-
您能否发布完整的、可编译的测试程序以进行基准测试(即使是在 ideone.com 等外部网站上)?
标签: c++ file c++11 buffer fstream