Xargs
為什麼 xargs -n 1 對於長行來說這麼慢
使用命令生成的一行
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/echo
8191 次。改為使用
| tr -s " " "\n"
。