我正在为自己写一个小C ++程序。在它开始时,我一直读到一个文件到底部,然后,在程序结束之前,我需要从头开始再次读取该文件。
我的问题是,在执行期间打开文件是否更有效率(甚至以为我不会使用它),只是在我再次需要时将其倒回,或者我应该在第一次关闭它然后再打开它什么时候需要呢?
编辑:只是为了澄清,我的问题不仅与我正在进行的具体项目有关。它非常小(少于300行代码),因此不会有明显的性能差异。我一般都在询问打开,关闭和“倒带”文件,所以它适用于其他大项目,性能和内存可能实际上很重要
答案 0 :(得分:3)
如果您fseek
到文件的开头,您可能能够在几纳秒的范围内测量一小部分获得的效率,但我不认为这只是值得的处理单个文件。
与其他人一样说:尝试找到可以优化的其他代码区域。
答案 1 :(得分:1)
如果您关闭并打开该文件,操作系统肯定需要为您的进程的文件和资源列表(打开的文件)更新系统锁定。此外,关闭和打开操作是两个systems calls (kernel calls)并且系统调用并不便宜。每次系统调用都需要翻译虚拟地址。
关闭文件可以(如果有任何变化)强制将缓存写入硬盘,这意味着寻找约15ms的时间(盘片的物理移动)。在网络驱动的情况下,情况会更糟。
关闭文件后,需要更新一些属性。可以启动FileSystem观察程序。
关闭文件后可能会触发防病毒扫描,这取决于文件名,路径,防病毒品牌。
此外,关闭文件存在风险,因为其他进程无法再次打开文件。例如,Dropbox在更改后读取Dropbox文件夹中的每个文件。因此,关闭和打开文件通常不会在Dropbox文件夹中起作用(Dropbox可能更快)。谁知道用户如何使用您的应用程序。用户很有创造力,他们共享您没有想到的文件。
答案 2 :(得分:0)
与所有性能问题一样,最终的优化变化很大。根据合理的数据集测量两种实现,并从那里获取。
作为设计选择,一旦第一次读取文件内容,就可以更简单地将文件内容缓存到内存中,然后无需重新读取内容。如果再次需要修改后的内容,则缓存修改后的数据以放弃第二次读取。