重複の可能性:
while(1)Vs. for(;;)速度の違いはありますか?
やあ、
無限ループを実装するためのより良い、より速く、より最適化された方法-for(;;)またはwhile(1)?なぜ?
重複の可能性:
while(1)Vs. for(;;)速度の違いはありますか?
やあ、
無限ループを実装するためのより良い、より速く、より最適化された方法-for(;;)またはwhile(1)?なぜ?
for(;;)
私はそれが何もテストしないので、意味的にこれがあなたが意味することであるために好みます。1が真であるかどうかをテストし続けることは、あまり意味がありません。ただし、プロのCプログラマーは、両方が使用されているため、すぐに両方のイディオムを認識する必要があります。
実際のパフォーマンスに関しては、違いはありません。コンパイラーはテストを最適化します。
どちらが速いかを確認するために両方をテストしてみましたが、どちらもまだ完了していません。
通常のコンパイラでは、まったく違いはありません。たとえば、次のように(フラグLLVM-clang
を使用して)生成されます。-O3
while (1) {}
.file "test.c"
.text
.globl main
.align 16, 0x90
.type main,@function
main:
pushl %ebp
movl %esp, %ebp
.align 16, 0x90
.LBB0_1:
jmp .LBB0_1
jmp .LBB0_1
実際の無限ループである部分に注意してください。この種の場合、まったく同じコードfor (;;)
が生成されます。
他のコンパイラを試して楽しむこともできますが、心配するのはやめるのが最善です。
OK、私も試してみる必要がありgcc
ました:
.file "test.c"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
.L2:
jmp .L2
どちらも、測定可能な時間内に無限にループするタスクを実行しないため、どちらもより最適化されているとは言えません。
多かれ少なかれ効率的に無限大に到達することは本当に可能ですか?
理論的には、完全にナイーブなコンパイラーは、リテラル「1」をバイナリー(スペースの浪費)に格納し、反復ごとに1 == 0(時間とスペースの浪費)かどうかを確認できます。
ただし、実際には、最適化が「ない」場合でも、コンパイラーは両方を同じに減らします。また、論理エラーを示している可能性があるため、警告が表示される場合もあります。たとえば、whileの引数は別の場所で定義できますが、それが一定であることに気付かない場合があります。
同じこと。コンパイラはそれを単一のJMP命令に変換します。
これは私の意見です(調査は行われていません):
コードをステップスルーしながらデバッグする場合、forループでは、最初に3つの部分すべてに移動し、次に残りの2つの反復に移動します。ただし、whileループには1つしかありません。ちょっとした考え。