C++ 系统(“rm x.*”与取消链接()的性能对比?

C++ 系统(“rm x.*”与取消链接()的性能对比?,c++,linux,filesystems,C++,Linux,Filesystems,我正在维护一个Linux遗留系统,它在一个大型存储阵列中维护数百万个小文件。(是的,文件系统噩梦) 在C++代码中,我发现文件被删除,就像系统(“RM -F/DR/DR/file .*”) 我怀疑使用unlink()会快很多,但是快多少?(我无法在生产中真正测试它) 有人有这方面的比较数据吗 旧代码已经很脆弱,用unlink()替换方便的system()调用,让globbing开始工作,等等,这是一项很好的工作…没有实际设置和测试它(在机器类型上,如果有正确的基础设施——例如,网络文件的行为不同

我正在维护一个Linux遗留系统,它在一个大型存储阵列中维护数百万个小文件。(是的,文件系统噩梦)

<>在C++代码中,我发现文件被删除,就像系统(“RM -F/DR/DR/file .*”)

我怀疑使用unlink()会快很多,但是快多少?(我无法在生产中真正测试它)

有人有这方面的比较数据吗


旧代码已经很脆弱,用unlink()替换方便的system()调用,让globbing开始工作,等等,这是一项很好的工作…

没有实际设置和测试它(在机器类型上,如果有正确的基础设施——例如,网络文件的行为不同于硬盘文件,硬盘文件也不同于闪存驱动器或SSD文件),确实不可能精确回答。但是,我们可以讨论“一个比另一个的开销是多少”:

unlink()
是您自己的可执行文件中的函数调用,然后转换为内核中的相关系统调用。您的代码必须迭代要删除的相关文件

system(“rm-something”)
将转换为
fork();exec(“sh”、“rm”、“something”);
,shell将对
“something”
执行
glob()
,它将扩展到相关的文件列表,然后执行
rm
,这将很快变成
取消链接()
,但有一点开销

归根结底,这实际上取决于文件的数量以及它们存储在什么文件系统中。如果有很多文件(数百或数千个),那么调用
system
的开销就很小。另一方面,如果您对每个(文件列表)系统(“rm”+文件列表中的文件”)执行
之类的操作,则
[这并不意味着要编译],对于大量文件,每个(文件列表中的文件)取消链接(文件列表中的文件)
的开销是显而易见的

通常,删除大量文件会很快受到I/O限制,因此无论使用何种方法,都将取决于“文件系统处理删除文件请求的速度”,而不是要求删除文件的代码的实际速度

如果您可以测量几十个以上文件的这两种解决方案之间的任何差异,这将是非常令人惊讶的,因为时间主要取决于实际执行文件系统操作所需的时间(读取目录、从目录列表中删除文件、存储目录列表)。调整文件系统参数更有可能(如果尚未调整的话)给您带来一些好处(例如,降低将新目录结构写回磁盘的标准,但这也会带来一些其他缺点,例如在崩溃/断电的情况下,文件系统的可靠性较低)