std :: fstream缓冲vs手动缓冲(为什么手动缓冲10倍增益)?
我testing了两种书写configuration:
1)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));
2)手动缓冲:
// 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缓冲与正常情况(没有重新定义缓冲)相比没有任何改变。
有人解释这种情况吗?
编辑:这里是新闻:一个超级计算机上的基准testing(Linux 64位体系结构,持续的英特尔至强8核心,Lustre文件系统和…希望configuration好的编译器) (我没有解释1kB手动缓冲区的“共振”原因…)
编辑2:和1024 B的共振(如果有人有一个想法,我感兴趣):
这基本上是由于函数调用开销和间接。 ofstream :: write()方法从ostreaminheritance。 该函数不在libstdc ++中内联,这是开销的第一个来源。 然后ostream :: write()必须调用rdbuf() – > sputn()来完成实际的写操作,这是一个虚函数调用。
最重要的是,libstdc ++将sputn()redirect到另一个虚函数xsputn(),它增加了另一个虚函数调用。
如果你自己把字符放入缓冲区,你可以避免这种开销。