文件创建/删除效率

File Creation/Deletion Efficiency?

本文关键字:效率 删除 文件创建      更新时间:2023-10-16

我编写的代码偶尔需要将数据写入文件,然后将该文件发送给另一个程序进行分析,并重复此过程。

文件的格式非常严格;头文件是必需的,但它们是不变的,只有大约10行。所以我有两个选项:

1。编写一个函数,从文件末尾删除行,直到到达头部分。

2。删除旧文件,并在其位置创建一个同名的新文件,每次重写头部分。

所以我的问题是:在文件创建和删除中是否存在显著的效率问题?写这个似乎比写一个动态的deleteLines()函数更容易,但是我对所涉及的开销很好奇。如果有关系的话,我正在用c++工作

问题是,不同的方法需要哪些操作?以下是一些答案:

截断文件意味着

  1. 更新控制文件的inode
  2. 更新空闲块的文件系统信息

删除文件意味着

  1. 更新包含到
  2. 文件链接的目录
  3. 减少文件引用计数并在必要时更新空闲块上的文件系统信息

创建文件意味着

  1. 创建索引
  2. 更新包含
  3. 文件的目录
  4. 更新空闲块的文件系统信息

向空文件添加数据意味着

  1. 为数据分配块,更新空闲块上的文件系统信息
  2. 更新控制文件的inode

我认为,很明显,删除/创建/追加文件比简单地在文件头后截断文件需要更多的操作。

然而,正如其他人所指出的,如果您想要速度,请使用管道或共享内存区域(有关详细信息,请参阅mmap()的文档)或类似的东西。磁盘是计算机中最慢的东西之一。

Ps:在设计/选择算法时忽略性能是所有缓慢代码的邪恶根源…在这方面,你最好听托瓦兹的话,而不是高德纳的话。

在这种情况下,性能取决于许多因素,如底层文件系统等。所以,基准测试。这样写起来很容易,而且会给你最好的答案。

记住Donand Knuth的话:

我们应该忘记小的效率,大约97%的时间:过早的优化是万恶之源。

删除旧文件并写入新文件可能更快,因为您只保留几个字节。如果修改现有文件,它必须先读取数据,然后再写入新数据。如果你直接写,那就只有写操作了

但主要的一点是,只编写新文件可能更容易实现和理解,所以它应该是您的默认选择,除非您发现应用程序不够快,并且分析显示此特定部分是瓶颈。