【问题标题】:Is it more efficient to rewind a file than closing it and opening it up again?倒带文件比关闭文件再打开更有效吗?
【发布时间】:2016-01-13 02:21:49
【问题描述】:

我正在为自己编写一个小 C++ 程序。在它开始时,我一直读取一个文件到底部,然后,在程序结束之前,我需要从头开始再次读取该文件。

我的问题是,在执行期间打开文件是否更有效(即使我不会使用它)并在我再次需要它时将其倒回,或者我应该第一次关闭它然后再次打开它什么时候需要?

编辑:澄清一下,我的问题不仅与我正在从事的特定项目有关。它真的很小(不到 300 行代码),所以不会有任何明显的性能差异。我问的是一般的打开、关闭和“倒带”文件,所以它适用于其他大型项目,性能和内存可能实际上很重要

【问题讨论】:

  • 如果你有方法,有没有两种方法都试过并测试了所需的时间?
  • 优化 C++ 代码的第一条规则:衡量一切。
  • 如果您不使用该文件,您可能应该关闭它,这样您就不会捆绑它。
  • 一开始你为什么要读两遍?如果您保持打开状态-那么您就不会期望内容发生变化...
  • 一般来说,打开它会更快,因为“倒带”通常只是重置文件偏移量。但细节很重要。无论如何,由于在大多数情况下所有文件元数据都会被缓存,因此差异甚至可能无法衡量。

标签: c++ performance file


【解决方案1】:

如果您 fseek 到文件的开头,您可能能够在几纳秒的范围内测量获得的效率的一小部分,但是当您只处理单个文件时,我认为这不值得文件。

就像其他人说的:尝试找到可以优化的其他代码区域。

【讨论】:

  • 确实如此。如果以终极速度为目标并且文件很小,只需将内容保存在内存中即可。如果文件太大而无法保存在内存中,则保持文件打开与重新打开文件之间的性能差异几乎肯定会小于文件读取速度的随机波动。
  • 根据具体情况,保留一个文件以降低第二次通过时出错的风险可能是值得的。另外,作为最近一直在进行 I/O 优化的 Windows 开发人员,我担心“几纳秒”可能是一个过于慷慨的估计(据记录,我一直看到最佳情况下的访问时间约为 30µs)。
【解决方案2】:

与所有性能问题一样,最终的优化差异很大。根据合理的数据集衡量这两种实现并从那里获取。

作为一种设计选择,在第一次读取文件内容后将其内容缓存在内存中可能会更简单,然后无需重新读取内容。如果再次需要修改后的内容,则缓存修改后的数据,放弃第二次读取。

【讨论】:

    【解决方案3】:

    如果您关闭并打开文件,操作系统肯定需要为您的进程的文件和资源列表(打开的文件)更新系统锁定。此外关闭和打开操作是两个systems calls (kernel calls),系统调用并不便宜。每个系统调用都需要转换虚拟地址。

    关闭文件可以(如果有任何变化)强制将缓存写入硬盘,这意味着寻道时间约为 15 毫秒(盘片的物理移动)。如果是网络驱动器,情况可能会更糟。

    关闭文件后,需要更新一些属性。可能会启动文件系统观察程序。

    关闭文件后可能会触发防病毒扫描,这取决于文件名、路径、防病毒品牌。

    此外,关闭文件是有风险的,因为另一个进程,您无法再次打开它。例如 Dropbox 在更改后读取 Dropbox 文件夹中的每个文件。所以关闭和打开文件通常在 Dropbox 文件夹中不起作用(Dropbox 可能更快)。谁知道用户如何使用您的应用程序。用户很有创造力,他们会分享你没想到的文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-01
      • 2017-05-26
      • 2015-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多