文件创建/删除效率?

时间:2013-06-13 18:36:56

标签: c++ performance file

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

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

1。编写一个函数来删除文件末尾的行,直到我到达标题部分。

2. 删除旧文件并创建一个名称相同的新文件,每次都重写标题部分。

所以我的问题是:文件创建和删除是否存在显着的效率问题?编写它似乎比编写动态deleteLines()函数更容易,但我对所涉及的开销感到好奇。如果重要,我正在使用C ++。

3 个答案:

答案 0 :(得分:1)

在这种情况下的性能取决于许多事情,在底层文件系统等。所以,基准它。它写起来会很容易,并会给你最好的答案。

请记住Donand Knuth的陈述:

  

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

答案 1 :(得分:1)

问题是,不同的方法需要采取什么行动?以下是一些答案:

截断文件意味着

  1. 更新控制文件的inode
  2. 更新空闲块上的文件系统信息
  3. 删除文件意味着

    1. 更新包含文件链接的目录
    2. 根据需要减少文件引用计数并更新空闲块上的文件系统信息
    3. 创建文件意味着

      1. 为它创建一个inode
      2. 更新包含文件的目录
      3. 更新空闲块上的文件系统信息
      4. 将数据添加到空文件意味着

        1. 为数据分配块,更新空闲块上的文件系统信息
        2. 更新控制文件的inode
        3. 我认为,很明显删除/创建/附加文件需要的操作比简单地在标题后截断文件要多得多。

          然而,正如其他人所说,如果你想要速度,请使用管道或共享内存区域(详情请参阅mmap()的文档)或类似内容。磁盘是有史以来最慢的内置电脑......

          Ps:在设计/选择算法时忽略性能是所有慢速代码的邪恶根源......在这方面你最好听听Torvalds而不是Knuth。

答案 2 :(得分:0)

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

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