一部の出力を3つの異なる方法でファイルにリダイレクトしていますが、それぞれに明らかに異なる時間がかかります。
$ >/tmp/file ; time for i in {1..1000}; do for j in {1..1000}; do echo $i $j >> /tmp/file; done; done
real 0m33.467s
user 0m21.170s
sys 0m11.919s
$ >/tmp/file ; exec 3>/tmp/file; time for i in {1..1000}; do for j in {1..1000}; do echo $i $j >&3; done; done; exec 3>&-
real 0m24.211s
user 0m17.181s
sys 0m7.002s
$ >/tmp/file ; time for i in {1..1000}; do for j in {1..1000}; do echo $i $j; done; done >> /tmp/file
real 0m17.038s
user 0m13.072s
sys 0m3.945s
誰かがここで違いを説明できますか?私の現在の理解/疑問は次のとおりです。
- 1つ目は、ファイルを複数回開いたり閉じたりするので最も遅くなりますが、他の1つは1回だけ実行します。そうですか?バッファリングについてはどうですか。通常、すべての出力がバッファリングされることを期待します。その場合、それほど大きな時間差はありません。
- 3番目に、すべての出力が外側のループの最後にのみ書き込まれる場合、ループの実行中にすべての出力が保存されます。おそらくメモリ内。たくさんのことをエコーして最後に書くだけだと、メモリが不足する可能性があるということですか?
- 2番目は1番目または3番目に似ています。なぜそれがどちらともそんなに違うのですか。
PS:上記のコマンドを数回実行しましたが、時間が一貫していることがわかりました。ですから、私が見ている違いは、いくつかの本当の理由によるものであるに違いありません。