增加的缓冲是否会提高C ++中ifstream.getline()的最高速度?

时间:2012-02-23 20:35:25

标签: c++ performance file-io ifstream

在使用MSVC ++ input.getline()读取非常大(3GB)分隔的文本文件之前,我想优化速度,增加输入缓冲区的大小:

    ifstream input("in1.txt");
    input.rdbuf()->pubsetbuf(NULL, 1024 * 1024);

然而,在执行代码时,速度没有提高,所以我想知道:

  • 代码有什么问题?
  • 缓冲是否适用于ifstream.getline?
  • 分配给ifstream的默认缓冲的大小是多少?

问候。

5 个答案:

答案 0 :(得分:3)

您是否考虑过mmap()系统调用?

  

mmap()函数应在进程之间建立映射'   地址空间和文件,共享内存对象或键入的内存   宾语。通话的格式如下:

     

pa = mmap(addr,len,prot,flags,fildes,off);

man page

MapViewOfFile是等效的窗口。

  

LPVOID WINAPI MapViewOfFile(__ in HANDLE hFileMappingObject,
  __in DWORD dwDesiredAccess,__ in DWORD dwFileOffsetHigh,__ in DWORD dwFileOffsetLow,__ in SIZE_T dwNumberOfBytesToMap);

答案 1 :(得分:0)

关于缓冲的事情是它在许多层面上工作,你有库(ifstream)级缓冲,你有OS级缓冲和硬件级缓冲。改变其中任何一个的大小可能会对性能产生重大影响或不存在影响。

真实的是,该程序的“逻辑”将比IO的速度快得多。

就个人而言,除非瓶颈严重,否则我会留下它。

答案 2 :(得分:0)

使用CreateFile和ReadFile可以获得绝对最快的性能。使用FILE_FLAGS_SEQUENTIAL_SCAN打开文件。

使用2的幂的缓冲区大小读取。只有基准测试可以确定这个数字。我曾经看过它是8K。另一次我发现它是8M!这种情况变化很大。

这取决于CPU缓存的大小,操作系统预读的效率以及与执行许多小写操作相关的开销。

内存映射不是最快的方式。它有更多的开销,因为你无法控制块大小,操作系统需要在所有页面中出错。

答案 3 :(得分:0)

您可以尝试使用操作系统提供的内存映射文件功能,如果内存不是问题,请尝试在处理之前将整个文件读入内存。

答案 4 :(得分:-1)

  

我想优化速度

摆脱fstream。一般而言,iostream是一个可怕的瓶颈。