bashも文字列連結には注意

javaの話で、よく文字列連結に+=を使っちゃ駄目だとか、StringBufferやStringBuilder使えだとかありますが、bashで文字列を並べるときには引用符で括ってつなげるのは駄目な話。

コマンドにファイル名を複数渡す処理なんかで、

の様な書き方をすると大変な目に合うので気をつけましょう。

書くならば

の様に、配列に追加するようにしましょう。

何故配列を使うのかというと、bashでは変数は内部的にmallocを呼んでヒープに格納している様なのですが、文字連結のように徐々にサイズが大きくなるmallocはfreeの領域の再利用が効きにくいので、多分unsortedがすぐ使えなくなりfreeの結合が毎度のように発生したり、仮想アドレスも前後にコロコロ変わってキャッシュが効きにくくなったり、そもそも連結するサイズが大きいのでそれだけ一度に大量のメモリを必要としたりするため処理時間が跳ね上がってるのだと思います。

timeコマンドで1万回10文字の連結を測定してみると、文字列連結の場合

このように10秒近い処理時間。

対して、配列を使用した場合。

0.1秒程度の処理時間。また、ヒープの使用サイズも620KBと400KBの様に、若干差が出ています。

 

文字連結の場合、時間の増加量が指数的に増えていくため、基本的にはループの中での使用は控えたほうが良さそうです。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)