2259エントリのディレクトリでこれを試し、time
コマンドを使用しました。
time for f in *; do echo "$f"; done
(マイナスファイル!)の出力は次のとおりです。
real 0m0.062s
user 0m0.036s
sys 0m0.012s
time find * -prune | while read f; do echo "$f"; done
(マイナスファイル!)の出力は次のとおりです。
real 0m0.131s
user 0m0.056s
sys 0m0.060s
キャッシュミスをなくすために、各コマンドを数回実行しました。これは、出力bash
を使用find
して(toにbash
)パイプするよりも(for i in ...)に保持することをお勧めします
完全を期すfind
ために、あなたの例では完全に冗長なので、からパイプを落としました。justの出力find * -prune
は次のとおりです。
real 0m0.053s
user 0m0.016s
sys 0m0.024s
また、time echo *
(出力は改行で区切られていません、悲しいかな):
real 0m0.009s
user 0m0.008s
sys 0m0.000s
この時点で、echo *
それほど多くの改行を出力していないため、出力がそれほどスクロールしていないので、理由はもっと速いと思います。テストしてみましょう...
time find * -prune | while read f; do echo "$f"; done > /dev/null
収量:
real 0m0.109s
user 0m0.076s
sys 0m0.032s
一方、time find * -prune > /dev/null
収量:
real 0m0.027s
user 0m0.008s
sys 0m0.012s
およびtime for f in *; do echo "$f"; done > /dev/null
収量:
real 0m0.040s
user 0m0.036s
sys 0m0.004s
そして最後に:time echo * > /dev/null
yields:
real 0m0.011s
user 0m0.012s
sys 0m0.000s
変動の一部はランダムな要因で説明できますが、明らかなようです:
- 出力が遅い
- 配管には少し費用がかかります
for f in *; do ...
はfind * -prune
、それ自体ではより遅いですが、パイプを含む上記の構造では、より速くなります。
また、余談ですが、両方のアプローチは、スペースで問題なく名前を処理するように見えます。
編集:
find . -maxdepth 1 > /dev/null
対のタイミングfind * -prune > /dev/null
:
time find . -maxdepth 1 > /dev/null
:
real 0m0.018s
user 0m0.008s
sys 0m0.008s
find * -prune > /dev/null
:
real 0m0.031s
user 0m0.020s
sys 0m0.008s
したがって、追加の結論:
find * -prune
より遅いfind . -maxdepth 1
-前者では、シェルはglobを処理してから、の(大きな)コマンドラインを構築していfind
ます。注意:をfind . -prune
返します.
。
その他のテスト time find . -maxdepth 1 -exec echo {} \; >/dev/null
::
real 0m3.389s
user 0m0.040s
sys 0m0.412s
結論:
- これまでで最も遅い方法。このアプローチが提案された答えに対するコメントで指摘されたように、各引数はシェルを生成します。
find
見つかったファイルを開きません。多数のファイルに関してここで噛みついているのはARG_MAXだけです。