为什么 xargs -n 1 对于长线如此缓慢

Krz*_*ski 1 xargs

命令生成的一行echo {,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}包含 8191 个单词,即 114687 个字符:106497 个点和 8190 个空格。

为什么拆分它| xargs -n 1需要计算时间?在我的电脑上是 8 秒。

背景故事。

与 bash 大括号扩展开玩笑,我偶然发现了一个奇特的问题。我正在检查示例问题上 bash 括号扩展的时间:在新行中打印一、二等直到 'n' (=13) 个点的字符串,避免显式循环和变量。我想出了这个有点慢的解决方案:

$ time echo {,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·} | xargs -n 1 | sort -u
·
··
···
····
·····
······
·······
········
·········
··········
···········
············
·············

real    0m8.800s
user    0m0.188s
sys     0m0.748s
Run Code Online (Sandbox Code Playgroud)

我认为这是由sort性能引起的,所以我检查了一个没有排序的解决方案:

$ time echo {,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·} | xargs -n 1 | awk '{if (!a[$0]) {print $0} ; a[$0]=$0}'
·
··
···
····
·····
······
·······
········
·········
··········
···········
············
·············

real    0m8.250s
user    0m0.152s
sys     0m0.784s
Run Code Online (Sandbox Code Playgroud)

哪个快一点。扩展本身出奇的快:

time echo {,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·} > /dev/null

real    0m0.024s
user    0m0.020s
sys     0m0.004s
Run Code Online (Sandbox Code Playgroud)

将点墙打印到控制台时为 0m0.250s,但与计算相比,这是通常较慢的输出。所以我检查了拆分成行需要多长时间:

time echo {,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·} | xargs -n 1 > /dev/null 

real    0m8.551s
user    0m0.096s
sys     0m0.724s
Run Code Online (Sandbox Code Playgroud)

xargs这么多时间在做什么?

Ipo*_*cer 6

xargs 很慢,因为它运行了/bin/echo8191 次。

使用| tr -s " " "\n"来代替。

  • 这甚至在其文档中明确说明,大声笑。_本手册页记录了 xargs 的 GNU 版本。xargs 从标准输入读取项目,以空格(可以用双引号或单引号或反斜杠保护)或换行符分隔,并执行命令_ **(默认为 /bin/echo)** _一次或多次初始参数后跟从标准输入读取的项目。标准输入上的空行被忽略。_ (2认同)