シェルスクリプトのループはあまり速くない。
なので、できるだけ速くさせるためにはリダイレクトの位置に気をつけたい。
これは遅い
これはどうだろうか。
あらかじめ、execコマンドで標準出力の向き先を変えておくとどうだろうか?
まあ、今回のケースではループする必要なんてないんですが。。。
というわけで、今回の教訓はシェルスクリプトでループは邪道。
じゃなくって、ループの中でリダイレクトするなってことでした。
なので、できるだけ速くさせるためにはリダイレクトの位置に気をつけたい。
これは遅い
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 件のコメント:
コメントを投稿