2015-10-14 67 views
3

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

我的问题是,在执行过程中打开文件(甚至认为我不会使用它)效率更高,并且在我再次需要时将它倒回,或者我应该在第一次关闭它时当我需要时再打开它?

编辑:为了澄清,我的问题不仅与我正在处理的具体项目有关。它非常小(少于300行代码),所以不会有明显的性能差异。我一般询问打开,关闭和“倒带”文件,所以它适用于其他大型项目,性能和内存实际上可能很重要倒带文件比关闭文件并再次打开文件效率更高?

+2

如果您有一种方法,您是否尝试过两种方法并测试了所花费的时间? –

+5

优化C++代码的第一条规则:衡量一切。 –

+0

如果你没有使用这个文件,你应该关闭它,这样你就不会捆绑它了。 – NathanOliver

回答

1

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

关闭文件可以(如果有任何改变)强制将缓存写入硬盘,这意味着寻找时间约15ms(盘片的物理移动)。在网络驱动的情况下可能会更糟糕。

关闭文件后,需要更新一些属性。 FileSystem观察器可能会启动。

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

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

3

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

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

+0

确实。如果最终的速度是目标,文件很小,只需将内容保存在内存中。如果文件太大而无法保存在内存中,保持文件打开与重新打开文件之间的性能差异几乎肯定会小于文件读取速度的随机波动。 –

+1

然而,根据具体情况,在第二次通过期间,为了降低错误风险,可能值得保留档案。另外作为最近进行I/O优化的Windows开发人员,我担心“几纳秒”可能比慷慨的估计更多(我记录的最佳访问时间大约为30μs)。 – doynax

0

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

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

相关问题