我正在编写偶尔需要将数据写入文件的代码,然后将该文件发送到另一个程序进行分析,然后重复该过程。
文件的格式非常死板;标题是必需的,但它们是不变的,只有大约 10 行。所以我有两个选择:
1.编写一个函数从文件末尾删除行,直到我到达标题部分。
2.删除旧文件,并在其位置创建一个同名的新文件,每次都重写标题部分。
所以我的问题是:文件创建和删除是否存在重大的效率问题?编写它似乎比编写动态deleteLines()
函数更容易,但我对所涉及的开销感到好奇。如果重要的话,我正在使用 C++。
我正在编写偶尔需要将数据写入文件的代码,然后将该文件发送到另一个程序进行分析,然后重复该过程。
文件的格式非常死板;标题是必需的,但它们是不变的,只有大约 10 行。所以我有两个选择:
1.编写一个函数从文件末尾删除行,直到我到达标题部分。
2.删除旧文件,并在其位置创建一个同名的新文件,每次都重写标题部分。
所以我的问题是:文件创建和删除是否存在重大的效率问题?编写它似乎比编写动态deleteLines()
函数更容易,但我对所涉及的开销感到好奇。如果重要的话,我正在使用 C++。
在这种情况下,性能取决于很多因素,比如底层文件系统等。所以,对它进行基准测试。写起来很容易,会给你最好的答案。
请记住 Donand Knuth 的声明:
我们应该忘记小的效率,比如大约 97% 的时间:过早优化是万恶之源。
问题是,不同的方法需要采取哪些行动?以下是一些答案:
截断文件意味着
删除文件意味着
创建文件意味着
将数据添加到空文件意味着
我认为,很明显,删除/创建/附加文件需要更多的操作,而不是简单地在标题之后截断文件。
但是,正如其他人所指出的,如果您想要速度,请使用管道或共享内存区域(有关详细信息,请参阅 mmap() 的文档)或类似的东西。磁盘是计算机中内置的最慢的东西之一...
Ps:在设计/选择算法时忽略性能是所有慢代码的邪恶根源......在这方面,您最好听 Torvalds 而不是 Knuth。
删除旧文件并写入新文件可能会更快,因为您只会保留几个字节。如果修改现有文件,则必须先读取数据,然后写入新数据。如果你继续写,那么只有写操作。
但主要的一点是,仅仅编写新文件可能更容易实现和理解,所以它应该是你的默认选择,除非并且直到你发现应用程序不够快并且分析表明这个特定的部分是一个瓶颈。