[bash]シェルスクリプトのループ内でのリダイレクト

シェルスクリプトのループはあまり速くない。
なので、できるだけ速くさせるためにはリダイレクトの位置に気をつけたい。

これは遅い
for i in $( seq 100000 )
do
  echo $i >>loop.dat
done
手元の環境で1.027秒かかった。
これはどうだろうか。
for i in $( seq 100000 )
do
  echo $i
done >>loop.dat
先ほどと同じ環境で0.609秒となった。40%もの改善だ。
あらかじめ、execコマンドで標準出力の向き先を変えておくとどうだろうか?
exec 1>loop.dat
for i in $( seq 100000 )
do
  echo $i
done
こちらは0.610秒。ループ自体をリダイレクトするのとほぼ同じ結果となった。
まあ、今回のケースではループする必要なんてないんですが。。。
seq 100000 >loop.dat
#ちなみにこれは0.011秒で終わる!

というわけで、今回の教訓はシェルスクリプトでループは邪道。
じゃなくって、ループの中でリダイレクトするなってことでした。

0 件のコメント:

コメントを投稿