我正在为自己写一个C++程序。在开始的时候,我一直读到底部的文件,之后,在程序结束之前,我需要从开始时再读取该文件。
我的问题是,在执行过程中打开文件(甚至认为我不会使用它)效率更高,并且在我再次需要时将它倒回,或者我应该在第一次关闭它时当我需要时再打开它?
编辑:为了澄清,我的问题不仅与我正在处理的具体项目有关。它非常小(少于300行代码),所以不会有明显的性能差异。我一般询问打开,关闭和“倒带”文件,所以它适用于其他大型项目,性能和内存实际上可能很重要倒带文件比关闭文件并再次打开文件效率更高?
回答
如果关闭并打开文件,操作系统肯定需要更新系统锁定文件和进程资源(打开的文件)的列表。此外关闭和开放操作是两个systems calls (kernel calls)和系统调用并不便宜。每个系统调用都需要翻译虚拟地址。
关闭文件可以(如果有任何改变)强制将缓存写入硬盘,这意味着寻找时间约15ms(盘片的物理移动)。在网络驱动的情况下可能会更糟糕。
关闭文件后,需要更新一些属性。 FileSystem观察器可能会启动。
关闭文件后可能会触发防病毒扫描,这取决于文件名,路径,防病毒品牌。
此外关闭文件是一个风险,你不能因为另一个进程再次打开它。例如Dropbox在更改后读取Dropbox文件夹中的每个文件。因此,关闭和打开文件通常不会在Dropbox文件夹中工作(Dropbox可能会更快)。谁知道用户如何使用你的应用程序。用户具有创造性,他们共享你没有想到的文件。
您可能能够测量一小部分获得的效率如果你fseek
到文件的开头几纳秒,但我不认为这是值得的,当你只处理单个文件。
像其他人一样说:尝试找到其他您可以优化的代码区域。
确实。如果最终的速度是目标,文件很小,只需将内容保存在内存中。如果文件太大而无法保存在内存中,保持文件打开与重新打开文件之间的性能差异几乎肯定会小于文件读取速度的随机波动。 –
然而,根据具体情况,在第二次通过期间,为了降低错误风险,可能值得保留档案。另外作为最近进行I/O优化的Windows开发人员,我担心“几纳秒”可能比慷慨的估计更多(我记录的最佳访问时间大约为30μs)。 – doynax
与所有性能问题一样,最终的优化差别很大。根据合理的数据集衡量两种实现并从中获取。
作为一种设计选择,一旦第一次读取文件后,将文件内容缓存在内存中可能会更简单,然后不需要重新读取内容。如果再次需要修改的内容,则缓存修改的数据以放弃第二次读取。
- 1. WinRT:关闭后再次打开之前打开的文件
- 2. 打开Excel文件,并在批处理文件然后再将它关闭
- 3. c#更多文件读取比。更多的文件打开/关闭速度
- 4. 更高效:打开(文件,“wb”):通过或os.remove(文件)
- 5. boost :: log关闭日志文件并打开一个新文件
- 6. 多次流关闭并打开相同的文件错误
- 7. 关闭读取文件并打开才能写出搜索结果字符串输出文件再次要求
- 8. 我需要后再次关闭文件开放文件FP在Python
- 9. 将.class文件转换为smali文件并再次打包.apk
- 10. 批处理文件 - 关闭打开的文本文件
- 11. 文件打开追加效率降低与文件大小
- 12. 打开/关闭文件多次或一劳永逸效果更好吗?
- 13. 打开带有文件名“=”的文件
- 14. MySQL比文件系统更高效吗?
- 15. 从php文档打开文件,并从另一个关闭它?
- 16. 需要批处理文件才能一次打开一个文件夹中的所有.XLSM文件(前一次关闭后再打开)
- 17. 关闭打开的h5py数据文件
- 18. 文件打开和关闭在Python
- 19. 使用C关闭打开的文件
- 20. 如何关闭打开的文件?
- 21. XMLStreamReader的不关闭打开XML文件
- 22. Haskell惰性打开和关闭文件
- 23. 打开文件时总是关闭
- 24. 不能打开关闭的文件
- 25. 重新打开关闭的文件:Lua
- 26. 无效synax关闭文件
- 27. 防止文件关联再次打开应用程序
- 28. 在OMEdit中打开多个文件时关闭一个文件
- 29. 关闭访问文件夹,但打开文件
- 30. 记录打开文件调试“ResourceWarning:未关闭的文件”
如果您有一种方法,您是否尝试过两种方法并测试了所花费的时间? –
优化C++代码的第一条规则:衡量一切。 –
如果你没有使用这个文件,你应该关闭它,这样你就不会捆绑它了。 – NathanOliver