【问题标题】:scenario in c++ binary file i/oC++ 二进制文件 i/o 中的场景
【发布时间】:2012-09-13 04:25:13
【问题描述】:

校园里大多数精明的学生都告诉过,二进制文件 i/o 总是比格式化 i/o 快。经过一番谷歌搜索,我确定完成二进制 i/o 的最有效方法不是直接从文件中流式传输每个值,而是通过读取大块数据,如 4k 或 8k 块,然后从该缓冲区中解析数据。我的问题是,假设我使用 fstream 从文件中抓取一大块数据并将其存储到 8192 字节的 char 数组中。现在假设它有一个大约 30 字节的标头,然后之后的所有数据就像每个 72 字节的结构。这将在最后留下 56 个字节的不完整数据,我无法读入结构。我如何处理这个以最大限度地提高效率(是的,使用 c++ 流,请不要在这里抱怨 c++ 流,我已经听到了很多关于它的论点。这完全是关于二进制 i/o 的问题,而不是特定介质的功效请输入/输出)。我是在最后留下 56 个字节未使用,还是尝试将下一个缓冲区的尾端和前 16 个字节一起弗兰肯斯坦,还是还有另一种方法来解决这个问题?我的问题也是,为什么在解析之前将块读入这样的缓冲区,更快?相反,如果您不相信这是真的,那么请在可能的情况下解释原因。感谢您的宝贵时间。

【问题讨论】:

  • 在任何合理的 CPU 上,直接的方法仍然足够快以跟上现代 SSD。 SSD 性能以毫秒为单位,CPU 性能以纳秒为单位。

标签: c++ file-io


【解决方案1】:

使用标准的iostream库,它会自动执行缓冲。

【讨论】:

  • 如果 iostream 自动缓冲,读入一个巨大的缓冲区并解析还是逐个变量地读取它会更快吗?
  • 也许不会,但应该足够快。瓶颈通常是系统调用的磁盘访问和上下文切换。因此,使用自己的缓冲区还是 iostream 库的缓冲区并不重要。您是否有需要解决的性能问题,或者这只是一个理论问题?
  • 完全是理论上的。出于学习目的,我一直在自己做一个项目,我喜欢在深入研究之前知道如何解决问题。感谢您的宝贵时间。
  • 那么,关于优化,您首先应该了解的是,在遇到性能问题之前不要打扰。然后使用分析器确定瓶颈在哪里,并专注于它们。
【解决方案2】:

首先,块被高估了。在您的情况下,没有理由读取 2^N 块只是为了以其他方式重新分块。

其次,如果你决定重新分块,你可以通过缓冲区和内存复制来做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 2014-03-12
    • 1970-01-01
    • 2018-05-04
    • 2014-07-06
    相关资源
    最近更新 更多