文件创建/删除效率
File Creation/Deletion Efficiency?
我编写的代码偶尔需要将数据写入文件,然后将该文件发送给另一个程序进行分析,并重复此过程。
文件的格式非常严格;头文件是必需的,但它们是不变的,只有大约10行。所以我有两个选项:
1。编写一个函数,从文件末尾删除行,直到到达头部分。
2。删除旧文件,并在其位置创建一个同名的新文件,每次重写头部分。
所以我的问题是:在文件创建和删除中是否存在显著的效率问题?写这个似乎比写一个动态的deleteLines()
函数更容易,但是我对所涉及的开销很好奇。如果有关系的话,我正在用c++工作
问题是,不同的方法需要哪些操作?以下是一些答案:
截断文件意味着
- 更新控制文件的inode
- 更新空闲块的文件系统信息
删除文件意味着
- 更新包含到 文件链接的目录
- 减少文件引用计数并在必要时更新空闲块上的文件系统信息
创建文件意味着
- 创建索引
- 更新包含 文件的目录
- 更新空闲块的文件系统信息
向空文件添加数据意味着
- 为数据分配块,更新空闲块上的文件系统信息
- 更新控制文件的inode
我认为,很明显,删除/创建/追加文件比简单地在文件头后截断文件需要更多的操作。
然而,正如其他人所指出的,如果您想要速度,请使用管道或共享内存区域(有关详细信息,请参阅mmap()的文档)或类似的东西。磁盘是计算机中最慢的东西之一。
Ps:在设计/选择算法时忽略性能是所有缓慢代码的邪恶根源…在这方面,你最好听托瓦兹的话,而不是高德纳的话。
在这种情况下,性能取决于许多因素,如底层文件系统等。所以,基准测试。这样写起来很容易,而且会给你最好的答案。
记住Donand Knuth的话:
我们应该忘记小的效率,大约97%的时间:过早的优化是万恶之源。
删除旧文件并写入新文件可能更快,因为您只保留几个字节。如果修改现有文件,它必须先读取数据,然后再写入新数据。如果你直接写,那就只有写操作了
但主要的一点是,只编写新文件可能更容易实现和理解,所以它应该是您的默认选择,除非您发现应用程序不够快,并且分析显示此特定部分是瓶颈。
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 使用函数"remove"删除重复元素
- 如何从多映射中删除特定的重复项
- 运算符C++ "delete []"仅删除 2 个前值
- 删除指向指针的指针是运行时错误吗
- 将指针设置为"nullptr"并不能防止双重删除?
- 为什么示例代码访问IUnknown中已删除的内存
- 如何通过 getter 函数删除矢量的元素?
- 从控制台中删除最后打印的元素
- C++中的线程安全删除
- 删除函数中的对象:丑陋、容易出错、效率低下,而且通常不安全
- 文件创建/删除效率