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 文などがあると使える数は減ります。
Comments