長い行では、xargs -n 1がなぜそんなに遅いのですか?

長い行では、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これまで何をしていましたか?

ベストアンサー1

/bin/echoxargsは8191回実行されるため遅いです。

代わりに使用してください| tr -s " " "\n"

おすすめ記事