Bashの「for」と「while read」はどちらが速いのか。

スポンサーリンク




気にしたことなかった。

いつも「a composer」をお読みいただきありがとうございます。banba(@banba929)です。

最近はもっぱらLinuxに触れています。CLIはなんだかかっこよくてテンションが上がりますね。

普段何気なく書いているシェルスクリプト。1行ごとの処理を行う際、僕は「while read」を用いて書いています。いつも通り書いていると先輩から「forとwhile readだとどっちが速いの?」と聞かれました。

「同じようにループしているから変わんないんじゃないですか?」なんて言いましたが何となく気になったので自宅のMacで検証してみます。

多分速さは変わんないよねー。

MacなのでLinuxではなくUnix環境ですが、なにかのお役に立てばと思います。

とりあえず記述

1行ごとに読む処理

for文

#/bin/bash

for line in `cat ループ処理したいテキスト.txt`

do

echo ${line}   #1行ごとにechoする

done

while read文

#/bin/bash

while read line

do

echo ${line}   #1行ごとにechoする

done < ループ処理させたいテキスト.txt

こんな感じですよね。やっている内容は全く同じなので、処理時間は変わらない予想です。

検証内容

今回処理するのはこちらのテキスト。約5万行のカンマ区切りのテキストファイル(CSVファイルかな)の2カラム目を別テキストに書き込む処理をします。

for文

While read文

こんな感じのシェルスクリプトを書きました。処理内容は全く同じ。

カンマ区切りの2カラム目を1行ずつ読み、別ファイルに追加していく処理です。同じファイルを読み込ませるようにしました。

処理開始

1回目

for文

それではfor文からやってみます。

for文の結果は3分52秒でした。

while read文

次にwhile read文です。

while read文の結果は3分58秒でした。6秒の差がありますね。やはりあまり差はないですね。もっと大きなファイルを使うと変わるのかもしれませんが。

2回目

なんとなく1回だと信用できなかったのでもう一度やってみました。

for文が3分51秒

while read分が3分56秒という結果に終わりました。

処理時間の差は5秒に縮まりましたが、あまり変わらないようです。

まとめ

やはりやっていることはほぼ同じなので大して処理時間は変わりませんでした。残念です。

シェルスクリプトはループさせると遅くなるそうなので、基本的にはコマンドや正規表現を駆使し、ループさせないよう書きたいですね。

僕は最近awkコマンドの便利さに感動していました。使いこなさなくては…

Linuxに触れ始めたのもつい最近なので、もっと使いこなしていきたいものです。CLI楽しいです…ワンライナーでちゃちゃっと書けるように頑張ります…

スポンサーリンク