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(),它增加了另一个虚函数调用。

如果你自己把字符放入缓冲区,你可以避免这种开销。