系统( "rm x.*" ) 与取消链接()的性能?
Performance of system("rm x.*") vs unlink()?
我正在维护一个Linux遗留系统,该系统在大型存储阵列中维护数百万个小文件。 (是的,文件系统的噩梦(
在C++代码中,我发现文件被删除,例如system("rm -f/dir/dir/file.*"(
我怀疑使用 unlink(( 会快得多,但快多少? (我无法在生产中真正测试它(
有人对此有一些比较数据吗?
旧代码已经很脆弱,用 unlink(( 替换方便的 system(( 调用并让通配工作等,是一大块工作......
如果没有实际设置并对其进行测试(在机器类型上,具有正确的基础架构 - 例如,网络文件的行为与硬盘文件不同,硬盘文件又不同于闪存驱动器或SSD文件(,真的不可能准确地回答。但是,我们可以讨论"一个相对于另一个的开销是多少":
unlink()
是您自己的可执行文件中的函数调用,然后转换为内核中的相关系统调用。您的代码必须循环访问要删除的相关文件。
system("rm something")
将转换为fork(); exec("sh", "rm", "something");
,并且shell将在"something"
上执行glob()
,该扩展到相关的文件列表,然后执行rm
,这很快变成了unlink()
,但是有一点开销。
最终,它实际上归结为文件的数量以及它们存储在哪个文件系统中。如果有很多文件(数百或数千(,那么调用system
的开销是微不足道的。另一方面,如果你做类似 for_each(list_of_files) system("rm " + file_in_list);
[这不是编译] 的事情,对于大量文件来说,for_each(list_of_files) unlink(file_in_list);
开销将是显而易见的。
通常,删除大量文件很快就会受到 I/O 限制,因此无论您使用哪种方法,都将取决于"文件系统处理删除文件请求的速度",而不是实际要求删除它的代码的速度。
如果您可以测量这两种解决方案之间对几十个文件的任何差异,那将是非常令人惊讶的 - 因为时间由实际执行文件系统操作所需的时间所支配(读取目录,从目录列表中删除文件,存储目录列表(。调整文件系统参数更有可能(如果尚未调整(给您带来一些好处(例如,减少将新目录结构写回磁盘的标准,但这也会带来一些其他缺点,例如在崩溃/断电的情况下文件系统的可靠性较低(。
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- CMake-按正确顺序将项目与C运行时对象文件链接
- 从链接列表c++中删除一个项目
- 有根的二进制搜索树.保留与其父级的链接
- 读取文件的最后一行并输入到链接列表时出错
- 静态数据成员的问题-修复链接错误会导致编译器错误
- node-gyp 在 macOS 上未正确链接库
- 基于boost的程序的静态链接——zlib问题
- 无法链接 CMake 中的本地库
- 内联函数中具有内部链接的全局变量
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 使用gcc从静态链接的文件中查找可选符号
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 性能 - 链接 C 尖锐和C++如何影响性能
- unordered_set与链接列表之间的性能比较
- 当我单独编译并链接时,函数的性能为什么会有所不同
- 链接分配的性能含义是什么
- Visual Studio c++中增量链接的低性能
- 系统( "rm x.*" ) 与取消链接()的性能?
- 未命名的命名空间和Visual C++链接器性能