【问题标题】:Which is faster, 'find -exec' or 'find | xargs -0'?'find -exec' 或 'find | 哪个更快? xargs -0'?
【发布时间】:2010-11-02 02:21:44
【问题描述】:

在我的 Web 应用程序中,我使用 PHP 脚本渲染页面,然后从中生成静态 HTML 文件。将静态 HTML 提供给用户以提高性能。 HTML 文件最终会变得陈旧,需要删除。

我正在讨论编写驱逐脚本的两种方法。

第一种是使用单个查找命令,例如

find /var/www/cache -type f -mmin +10 -exec rm \{} \;

第二种形式是通过 xargs 管道,类似于

find /var/www/cache -type f -mmin +10 -print0 | xargs -0 rm

第一种形式为它找到的每个文件调用rm,而第二种形式只是将所有文件名发送到一个rm(但文件列表可能很长)。

哪种形式会更快?

在我的例子中,缓存目录在几个 Web 服务器之间共享,所以这一切都是通过 NFS 完成的,如果这对这个问题很重要的话。

【问题讨论】:

    标签: shell unix find xargs


    【解决方案1】:

    xargs 版本在处理大量文件时比您发布的 -exec 版本快得多,这是因为 rm 对您要删除的每个文件执行一次,而 xargs将尽可能多的文件合并到一个 rm 命令中。

    对于数万或数十万个文件,它可能是一分钟或更短时间与一小时大部分时间之间的差异。

    您可以通过使用“+”而不是“\;”结束命令来获得与 -exec 相同的行为。 此选项仅适用于较新版本的find

    以下两个大致等价:

    find . -print0 | xargs -0 rm
    find . -exec rm \{} +
    

    请注意,xargs 版本在多处理器系统上的运行速度仍会稍微快一些(提高几个百分点),因为某些工作可以并行化。如果涉及大量计算,则尤其如此。

    【讨论】:

    • 我发现 xargs 是一种更快的方法。我花了将近两个小时浏览前 250,000 个文件。然后我偶然发现了这个 SO 并尝试了 xargs。像冠军一样在半小时内完成剩下的 750,000!
    • -exec ... +find 的 POSIX 标准的一部分;对它的支持应该相当广泛。
    【解决方案2】:

    我希望 xargs 版本会稍微快一些,因为您不会为每个文件名生成一个进程。但是,如果实际上在实践中有很大差异,我会感到惊讶。如果您担心 xargs 发送给每个 rm 调用的长列表,您可以使用 -l 和 xargs 来限制它将使用的令牌数量。但是,xargs 知道最长的 cmdline 长度,不会超过这个长度。

    【讨论】:

    • 我认为如果参数的数量大于 shell 的最大值,xargs 会自动(不带 -l)产生多个进程。
    • 谢谢。我不知道 xargs 可以做到这一点。
    【解决方案3】:

    find 命令有一个内置的 -delete 选项,也许这也有用? http://lists.freebsd.org/pipermail/freebsd-questions/2004-July/051768.html

    【讨论】:

    • 很好,谢谢。我查看了手册页,在任何人想要将 -delete 选项与 find 一起使用之前,应该理解一个警告。我不能在这里粘贴,但一定要仔细阅读那个人。
    【解决方案4】:

    与使用 find 的 exec 相比,使用 xargs 更快。

    我尝试使用 xargs 和 exec 计算 node_module 文件夹中带有 js 扩展名的文件中的行数。所以下面的输出。

    time find . -type f -name "*.js" -exec wc -l {} \;
    
    real    0m0.296s
    user    0m0.133s
    sys     0m0.038s
    
    time find . -type f -name "*.js" |xargs wc -l
    real    0m0.019s
    user    0m0.005s
    sys     0m0.006s
    

    xargs 的执行速度比 exec 快大约 15 倍。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 2019-04-09
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多