ちょっとした小ネタを。6年以上前にに某18禁ゲームメーカのプログラマとして面接に行った時に出されたプログラムテクニックのクイズです。
Q. 以下のC言語で記述された無限ループのコードのうち、実行速度が速いものから順に並べなさい。
[P1]
while(1){ ...(何らかの処理) }[P2]
for(;;){ ...(何らかの処理) }[P3]
do{ ...(何らかの処理) } while(1);
この問題ですが、正しい回答はたぶん以下の通り。
A.
最適化を考えないのであれば実行命令数が少なくなる方から順にP2,P3,P1。
最適化を考えるのであればどれも実行命令数は変わらない。(最適化によってどれも判定のない無限ループに変換されると考えられる)
最適化を考える方は「ほとんどの場合」という制約がつきます。最適化が失敗した時は考えないのと同じになるからです。VC++やGCCレベルのコンパイラならその心配はほとんどありません。
答えにたどり着くためにこれらのコードをちょっと変換します。これはコードをifとgotoの形に変換した時どう記述されるか、という問題です。
[P1′]
loop: if(1){ ...(何らかの処理) goto loop; }[P2′]
loop: ...(何らかの処理) goto loop;[P3′]
loop: ...(何らかの処理) if(1){ goto loop; }
P1’とP3’パターンでif文があるのがわかると思います。最適化が働けばif(1)は常に真なので判定は消滅します。そのため実行命令数はP1=P2=P3となります。
最適化がない時はifの実行回数として少ない方からP2[0回]<P3[ループリミット-1回]<P1[ループリミット回]となり、上のような回答になる・・・はずです。
私は無限ループを記述する時はいつもP1パターンを使っているので最適化がない時はあまりよくないんですよね・・・。私的に無限ループの意味がとりやすいのでこの記法ですが・・。
ちなみにもちろんその会社の面接に落ちているからこんなことをやっています。その当時はかなり技量も低かったので当たり前なのですが・・・。
落ちたからこそいろいろなことを独学で勉強して伸ばしていくわけですね・・・。
いつも楽しく観ております。
また遊びにきます。
ありがとうございます。