6

重複の可能性:
while(1)Vs. for(;;)速度の違いはありますか?

やあ、

無限ループを実装するためのより良い、より速く、より最適化された方法-for(;;)またはwhile(1)?なぜ?

4

6 に答える 6

49

for(;;)私はそれが何もテストしないので、意味的にこれがあなたが意味することであるために好みます。1が真であるかどうかをテストし続けることは、あまり意味がありません。ただし、プロのCプログラマーは、両方が使用されているため、すぐに両方のイディオムを認識する必要があります。

実際のパフォーマンスに関しては、違いはありません。コンパイラーはテストを最適化します。

どちらが速いかを確認するために両方をテストしてみましたが、どちらもまだ完了していません。

于 2010-08-17T18:38:55.213 に答える
19

通常のコンパイラでは、まったく違いはありません。たとえば、次のように(フラグLLVM-clangを使用して)生成されます。-O3while (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
于 2010-08-17T18:39:13.203 に答える
4

どちらも、測定可能な時間内に無限にループするタスクを実行しないため、どちらもより最適化されているとは言えません。

多かれ少なかれ効率的に無限大に到達することは本当に可能ですか?

于 2010-08-17T18:39:19.620 に答える
2

理論的には、完全にナイーブなコンパイラーは、リテラル「1」をバイナリー(スペースの浪費)に格納し、反復ごとに1 == 0(時間とスペースの浪費)かどうかを確認できます。

ただし、実際には、最適化が「ない」場合でも、コンパイラーは両方を同じに減らします。また、論理エラーを示している可能性があるため、警告が表示される場合もあります。たとえば、whileの引数は別の場所で定義できますが、それが一定であることに気付かない場合があります。

于 2010-08-17T18:42:01.137 に答える
1

同じこと。コンパイラはそれを単一のJMP命令に変換します。

于 2010-08-17T18:39:39.753 に答える
0

これは私の意見です(調査は行われていません):

コードをステップスルーしながらデバッグする場合、forループでは、最初に3つの部分すべてに移動し、次に残りの2つの反復に移動します。ただし、whileループには1つしかありません。ちょっとした考え。

于 2010-08-17T18:39:27.920 に答える