ループの処理について

2012.02.24

こんにちは、はじめまして。アーキテクトの小山です。
私は主に眼に見えない部分のロジックを作っています。一番良く使うのはPHPなので、そこを中心にお話をさせていただこうと思っています。

プログラムする時はなるべく軽く、見やすくを意識して作るのが普通です。
今回は『軽さ』に注目して、大量の処理を一挙に引き受けるループ処理について考えてみます。

ループは大量の処理を一度に行うことのできる便利な制御構文で、
本当に毎日お世話になっていますが具体的にどの程度違うのでしょうか。
扱う処理が大量になればなるほど、ループ一回にかかる時間というものの重要性は上がっていきます。

そこで、ループ3つの速度を測定してみました。

1.for

2.while

3.foreach

各ループには、0から100000までの数を一つずつ数えて貰います。
実際に走らせた処理は以下のとおり。

1.for
$a=0;
for($i=0;$i<100000){
$a=++;
}

2.while
$a=0;
$i=0;
while($i<100000){
$a++;
$i++;
}

3.foreach
$a=range(0,100000);
foreach($a as $i):

それぞれのループを10回、順番に走らせてみると以下の結果が得られました。

for
0.010206
0.010069
0.010265
0.010255
0.010209
0.010119
0.01015
0.010119
0.010153
0.010279

平均:0.0101824

while
0.009755
0.009707
0.009871
0.009889
0.009741
0.0097
0.009788
0.009759
0.010047
0.009721

平均:0.0097978

foreach
0.030929
0.033306
0.03093
0.032234
0.032516
0.032299
0.032853
0.031038
0.034353
0.040717

平均:0.0331175

他とかなりの差をつけてwhileの勝利となりました。一番単純な繰り返し構造をしているからですね。
foreachについてですが、もともとforeachは連想配列や多次元配列向けのループなので単純なループを扱う割には早い、といったところでしょうか。
また、rangeで変数を定義している部分を計測から外すとforと同じくらいの速さになったので、優秀なほうであると言えるでしょう。

処理速度は、サーバに依存する部分もありますが、
こういった細かい部分にも気を配って軽快なプログラムを組むことは大切ですね。

lab-php5

一覧へ