Xargs

為什麼 xargs -n 1 對於長行來說這麼慢

  • December 28, 2016

使用命令生成的一行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

我認為這是由sort性能引起的,所以我檢查了一個沒有排序的解決方案:

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

real    0m8.250s
user    0m0.152s
sys     0m0.784s

這有點快。擴展本身速度驚人:

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

real    0m0.024s
user    0m0.020s
sys     0m0.004s

將點牆列印到控制台時為 0m0.250s,但與計算相比,這是通常較慢的輸出。所以我檢查了拆分為行需要多長時間:

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

real    0m8.551s
user    0m0.096s
sys     0m0.724s

這段時間在做什麼xargs

xargs 很慢,因為它執行了/bin/echo8191 次。

改為使用| tr -s " " "\n"

引用自:https://unix.stackexchange.com/questions/333319