C ++:提高ifstream二进制文件的读取速度

酒吧怪兽

我正在将小型程序从PHP重写为C ++。这个想法基本上是读取SSD上的32Gb文件并对其执行一些简单的操作。

我将Visual Studio 2012与x64发行版一起使用。PHP是5.3 32位。

问题是PHP的裸读速度比C ++快,这确实让我感到困惑。PHP的速度约为350 Mb / s,而C ++ / ifstream的代码速度为180 Mb / sec。

代码真的很简单:

ifstream datafile("data.txt", ios::binary);

while(datafile.read((char*)buffer, data_per_chunk)) {
//  do stuff;

我尝试了高达16Mb的不同大小的缓冲区,但差别不大。我还尝试通过datafile.rdbuf()-> pubsetbuf(...)设置内部缓冲区,但它也没有改变。

关于如何加快ifstream的速度而又不恢复到古老的C级接口的任何提示?我想至少达到PHP的性能水平。也许一些花哨的预读/缓存设置或其他内容。

我知道内存映射的文件可能会有所帮助,但是如果可以简化事情,因为文件明显大于物理RAM且大于4Gb,即可能的32位构建不可行,则我宁愿调整ifstream的设置。 。

酒吧怪兽

看来即使使用ifstream也可以达到最大的SSD读取速度。

为此,您需要将内部ifstream读缓冲区设置为〜2Mb,这是峰值SSD读取速度发生的地方,同时恰好适合CPU的二级缓存。然后,您需要分块读取小于内部缓冲区的数据。以8-16kB的块读取数据具有最佳结果,但比以1Mb的块读取速度仅快约1%。

设置ifstream内部缓冲区:

ifstream datafile("base.txt", ios::binary);
datafile.rdbuf()->pubsetbuf(iobuf, sizeof iobuf);

通过所有这些调整,我获得了495 Mb / sec的读取速度,这接近M500 480Gb SSD的理论最大值。在执行期间,CPU负载为5%,这意味着它实际上不受ifstream实现开销的限制。

我发现ifstream和std :: basic_filebuf之间没有明显的速度差异。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

读取二进制文件c

来自分类Dev

使用ifstream从C ++文件中读取二进制无符号短整数

来自分类Dev

C:从二进制文件读取字节

来自分类Dev

在C ++中读取二进制文件的正确方法?

来自分类Dev

从C中的文件读取二进制整数

来自分类Dev

从二进制文件C ++读取16位整数

来自分类Dev

在Java中读取C ++二进制文件

来自分类Dev

读取结构化二进制文件c ++

来自分类Dev

如何优化C ++二进制文件读取?

来自分类Dev

使用c以二进制模式读取文件

来自分类Dev

读取二进制文件,直到结束c ++

来自分类Dev

在C ++中从文件读取ASCII和二进制

来自分类Dev

从C中的二进制文件读取

来自分类Dev

使用StringStream在C ++中读取二进制文件

来自分类Dev

C:从二进制文件读取字节

来自分类Dev

在C ++中读取压缩的二进制文件

来自分类Dev

通过 C++ 读取二进制文件的问题

来自分类Dev

从 C 中的二进制文件读取值

来自分类Dev

搜索二进制文件C ++

来自分类Dev

C ++二进制文件构造

来自分类Dev

搜索二进制文件C ++

来自分类Dev

C ++二进制文件

来自分类Dev

C二进制读写文件

来自分类Dev

读取C中的二进制(.hgt)文件(将代码从C ++迁移到C)

来自分类Dev

如何从二进制文件读取为C中的文本文件?

来自分类Dev

霍夫曼压缩读取文件不会复制二进制文件C ++中的所有字节

来自分类Dev

如何在C ++中使用混合文本和二进制文件读取大文件

来自分类Dev

如何从二进制文件读取为C中的文本文件?

来自分类Dev

霍夫曼压缩读取文件不会复制二进制文件C ++中的所有字节