【问题标题】:Does increased buffering improves top speed of the ifstream.getline() in C++?增加缓冲是否会提高 C++ 中 ifstream.getline() 的最高速度?
【发布时间】:2012-02-23 20:35:24
【问题描述】:

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

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

但是在执行代码的时候,速度并没有提高,所以我想知道:

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

问候。

【问题讨论】:

标签: c++ performance file-io ifstream


【解决方案1】:

你考虑过 mmap() 系统调用吗?

mmap() 函数应在进程之间建立映射' 地址空间和文件、共享内存对象或类型化内存 目的。调用格式如下:

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

man page

MapViewOfFile 是 windows 等价物。

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

【讨论】:

  • 艾夫斯,感谢您的帮助!虽然 windows 的代码看起来很糟糕而且非常接近 C。我不敢相信使用 STL 提高速度是不可能的。
【解决方案2】:

关于缓冲的事情是它在许多级别上工作,您有库(ifstream)级别的缓冲,您有操作系统级别的缓冲和硬件级别的缓冲。更改其中任何一个的大小都可能对性能产生重大或不存在的影响。

事实是,程序的“逻辑”将比 IO 快得多。

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

【讨论】:

  • “程序的“逻辑”将比 IO 快得多”这是一个没有人测试过的常见假设。他们只是以此为借口不让 I/O 更快。由于从不担心 I/O 性能,它真的非常非常慢。
  • @BenVoigt:+1 我同意!随着市场上 10g 和 40g NIC 的兴起,I/O 实际上使 CPU 饱和,“逻辑”迅速成为瓶颈,而“逻辑”中输入的愚蠢/低效处理是大多数速度下降的原因。跨度>
【解决方案3】:

您将通过使用 CreateFile 和 ReadFile 获得绝对最快的性能。使用 FILE_FLAGS_SEQUENTIAL_SCAN 打开文件。

读取的缓冲区大小是 2 的幂。只有基准测试才能确定这个数字。我曾经看过它是8K。还有一次我发现它是8M!这变化很大。

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

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

【讨论】:

  • 接受的答案解释了为什么会这样。他也没有使用 FILE_FLAG_SEQUENTIAL_SCAN。
  • 是的,我在 cmets 告诉他了。但MapViewOfFile 的执行速度比FILE_FLAG_NO_BUFFERING 快很多这一事实表明,内存映射要么比ReadFile 高效得多,这可能是因为不需要将所有内容从缓存复制到应用程序拥有的私有页面,或者内存映射自己进行预取(在那个问题中,ReadFile 已关闭),或者两者兼而有之。
  • 是的,内存映射会自行预取。至少根据“Windows Internals”一书。缓存管理器甚至可以检测某些访问模式。它会在内部自动切换到 SEQUENTIAL 或 RANDOM_ACCESS 模式。
  • FILE_FLAG_NO_BUFFERING 意味着您会为每个块进行磁盘查找,因为没有预取会使驱动器保持忙碌。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    我想优化速度

    摆脱fstream。 iostream 通常是一个可怕的瓶颈。

    【讨论】:

    • Ben,我被 google 测试说服 C++ 是最快的语言,当然,它也包括 STL :-(
    • @user255053:我严重怀疑您使用的是 STL,即使您使用了,iostreams 也从未参与其中。 C++ 标准库可能优化也可能不优化,具体取决于实现和您使用的特定部分。
    猜你喜欢
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    相关资源
    最近更新 更多