case と if の速度比較

情報系学部のうちのC言語担当だった某教授が残した名言がたくさんあるのですが、その中に、「case 文は処理が重くなるのでできるだけif 文を使いなさい」というのがありました。

というわけで、実際どうなのか試してみました。

    int i=init,b,z,j;
    z=GetTickCount();
    for(j=0;j<50000000;j++)
    {
switch(i){
case 0:b=0;break;
case 1:b=2;break;
case 2:b=4;break;
          :
case 120:b=240;break;
}
   printf("%d\n",GetTickCount()-z);
}

init=0の時は3度実行して、375/282/266/344/328(間の3つの平均318)
init=120の時は3度実行して、343/375/312/250/344(間の3つの平均333)

    int i=init,b,z,j;
    z=GetTickCount();
    for(j=0;j<50000000;j++)
    {
    if(i==0){b=0;}
else if(i==1){b=2;}
else if(i==2){b=4;}
else if(i==3){b=6;}
          :
else if(i==120){b=240;}
}
   printf("%d\n",GetTickCount()-z);
}

init=0の時は5度実行して、203/203/203/219/172(間の3つの平均203)
init=10の時は5度実行して、640/688/671/703/656(間の3つの平均672)
init=120の時は5度実行して、4750/4766/4734/4891/4703(間の3つの平均4750)

というわけで if文のブロックが1つ増えるごとに45 前後処理時間が増加 5ブロックになると処理時間が逆転、平均すると8ブロックだとほぼ同じ処理時間という感じでしょうか

まぁ、else if を 8 以上使うときは case の方が高速という結論で、if ~ else 文 が早いとは限らないでした。(分岐が多い場合はむしろ case を使うべきなのでした)

ちなみに、Visual Studio 2005 だと、ブロックの数が 122 個になると

fatal error C1061: コンパイラの制限 : プログラム内のブロックの入れ子のレベルが深すぎます。

というエラーになります。

else if のブロック数ではなく、外にさらに if 文などがあると使える数は減ります。

おすすめ

コメントを残す

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