「for(;;)」は「while(TRUE)」よりも速いですか?そうでなければ、なぜ人々はそれを使うのですか?

165
Chris Cooper 2010-04-10 12:04.
for (;;) {
    //Something to be done repeatedly
}

このようなものがよく使われているのを見たことがありますが、それはかなり奇妙だと思います...と言うのwhile(true)はもっとはっきりしているのではないでしょうか?

私は(多くのプログラマーが不可解なコードに頼る理由であるように)これはわずかなマージンより速いと推測していますか?

なぜ、そしてそれは本当に価値がありますか?もしそうなら、なぜそれをこのように定義しないのですか?

#define while(true) for(;;)

参照:どちらが速いか:while(1)またはwhile(2)?

20 answers

263
Ben Zotto 2010-04-10 12:06.
  1. それは速くはありません。
  2. 本当に気になる場合は、プラットフォーム用のアセンブラ出力を使用してコンパイルし、確認してください。
  3. それは問題ではありません。これは決して重要ではありません。好きなように無限ループを書いてください。
178
jalf 2010-04-10 13:11.

for(;;)は2つの理由で好みます。

1つは、一部のコンパイラが警告を生成するwhile(true)ことです(「ループ条件は一定です」など)。警告を回避することは常に良いことです。

もう1つは、for(;;)より明確でわかりやすいと思うことです。無限ループが必要です。それは文字通り条件なく、何にも依存しません。私はそれから抜け出すために何かをするまで、それが永遠に続くことを望んでいます。

それに対してwhile(true)、まあ、本当は何と関係があるのでしょうか?trueがfalseになるまでループすることに興味はありません。これは、このフォームが文字通り言っていることです(trueがtrueのときにループします)。ループしたいだけです。

いいえ、パフォーマンスの違いはまったくありません。

57
ta.speot.is 2010-04-10 12:10.

個人的にはfor (;;)数字が入っていないので使っていますが、それはただのキーワードです。私はそれを好むwhile (true)while (1)while (42)while (!0)などなど

49
Mark Harrison 2010-04-10 14:26.

デニス・リッチーのため

  • for (;;)デニス・リッチーがK&Rでそれを行う方法であるため、私は使い始めました。新しい言語を学ぶとき、私は常に賢い人を真似ようとします。

  • これは慣用的なC / C ++です。C / C ++の分野で多くのことを行う予定がある場合は、長期的にはそれに慣れたほうがよいでしょう。

  • あなたの#define事は#1 define'dされて以来の意志ではない仕事は、C識別子に見えるように持っています。

  • 最新のコンパイラはすべて、2つの構造に対して同じコードを生成します。

46
Matthew Flaschen 2010-04-10 12:08.

確かに、どのコンパイラでも高速ではありません。それらは両方とも無条件のジャンプにコンパイルされます。forバージョンは(Neilが言ったように)入力が簡単で、forループ構文を理解していれば明確になります。

興味があれば、gcc4.4.1がx86に対して私に与えるものは次のとおりです。どちらもx86JMP命令を使用します。

void while_infinite()
{
    while(1)
    {
    puts("while");
    }
}

void for_infinite()
{
    for(;;)
    {
    puts("for");
    }
}

(部分的に)コンパイルします:

.LC0:
.string "while"
.text
.globl while_infinite
    .type   while_infinite, @function
while_infinite:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp .L2: movl $.LC0, (%esp)
    call    puts
    jmp .L2
    .size   while_infinite, .-while_infinite
    .section    .rodata
.LC1:
    .string "for"
    .text
.globl for_infinite
    .type   for_infinite, @function
for_infinite:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp .L5: movl $.LC1, (%esp)
    call    puts
    jmp .L5
    .size   for_infinite, .-for_infinite
43
Boann 2012-08-27 16:26.

for (;;)さまざまなCのような言語で最も一貫しているので、私は好みます。

C ++ではwhile (true)問題trueありませんTRUEが、Cではヘッダーを使用して定義しますが、一般的に使用されるマクロでもあります。使用while (1)する場合、CとC ++、およびJavaScriptでは正しいですが、JavaまたはC#では正しくありません。JavaまたはC#では、ループ条件がwhile (true)またはなどのブール値である必要がありますwhile (1 == 1)。PHPでは、キーワードは大文字と小文字を区別しませんが、言語では大文字が優先されTRUEます。

ただし、for (;;)これらすべての言語で常に完全に正しいです。

21
Michael Burr 2010-04-10 13:16.

私は個人的にfor (;;)イディオムを好みます(これはと同じコードにコンパイルされwhile (TRUE)ます。

使用してwhile (TRUE)、ある意味でより読みやすいかもしれ、私が使用することを決定しましたfor (;;)のでイディオムを、それが際立っています

無限ループ構造は、コードで簡単に認識または呼び出されるはずです。個人的には、for (;;)このスタイルの方がwhile (TRUE)またはよりも少し優れていると思いますwhile (1)

また、whileループの制御式が定数の場合、一部のコンパイラが警告を発行することを思い出します。それはあまり起こらないと思いますが、誤った警告が発生する可能性があるだけで、それを避けたいと思うことができます。

17
rmeador 2010-04-10 12:30.

私は、次のような場所に#defineがあるため、これを好む人を見てきました。

#define EVER ;;

これにより、彼らはこれを書くことができます:

for (EVER)
{
    /* blah */
}
16
bungle 2010-04-10 13:17.

どうですか(あなたの言語がそれをサポートしている場合):

start:
/* BLAH */
goto start;
12
Jason Williams 2010-04-10 12:18.

生成されるマシンコードに関しては違いはありません。

ただし、トレンドに逆らうために、while(TRUE)形式はfor(;;)よりもはるかに読みやすく直感的であり、読みやすさと明快さがコーディングガイドラインの重要な理由であると私は主張します。 for(;;)アプローチについて聞いたことがあります(コーディングガイドラインは、確かな推論や有効性の証明に基づいていることを好みます)。

11
James McLeod 2010-04-10 12:09.

よく知られているパターンだけでなく、C(およびC ++)の標準的なイディオム

11
Michael 2010-04-10 19:49.
while(true)

Visual Studioで警告を生成します(条件は一定です)。私が働いたほとんどの場所では、エラーとして警告を表示して本番ビルドをコンパイルしています。そう

for(;;)

が好ましい。

11
SylvanBlack 2013-10-02 21:39.

コードがコンパイラによって最適化されている場合は、両方が同じである必要があります。最適化の意味を説明するために、MSVC10で記述されたサンプルコードを次に示します。

int x = 0;

while(true) // for(;;)
{
    x +=1;

    printf("%d", x);
}

デバッグモード(最適化(/ Od)なし)でビルドした場合、逆アセンブリは明確な違いを示します。true内の状態に関する追加の指示がありますwhile

while(true)
00D313A5  mov         eax,1                //extra 
00D313AA  test        eax,eax              //extra
00D313AC  je          main+39h (0D313B9h)  //extra
    {
        x +=1;
00D313AE  mov         eax,dword ptr [x]  
00D313B1  add         eax,1  
00D313B4  mov         dword ptr [x],eax  
    printf("%d", x);
    ...
    }
00D313B7  jmp         main+25h (0D313A5h)  


for(;;)
    {
        x +=1;
00D213A5  mov         eax,dword ptr [x]  
00D213A8  add         eax,1  
00D213AB  mov         dword ptr [x],eax  
    printf("%d", x);
    ...
    }
00D213AE  jmp         main+25h (0D213A5h)  

ただし、リリースモード(デフォルトの最大化速度(/ O2))でコードをビルドすると、両方で同じ出力が得られます。両方のループが1つのジャンプ命令に削減されます。

for(;;)
    {
        x +=1;
01291010  inc         esi  

        printf("%d", x);
    ...
    }
0129101C  jmp         main+10h (1291010h)  

    while(true)
    {
        x +=1;
00311010  inc         esi  

        printf("%d", x);
    ...
    }
0031101C  jmp         main+10h (311010h)  

速度最適化がオンになっている適切なコンパイラでは、どちらを使用するかは重要ではありません。

10
Mark Rejhon 2010-04-10 12:14.

どちらが速いかは個人的な好みの問題です。個人的には、私はタッチタイピストであり、プログラミング中にキーボードを見ることはありません。キーボードの104個のキーすべてをタッチタイプできます。

「while(TRUE)」と入力する方が速いかどうかを確認します。

私は精神的にいくつかの指の動きの測定値を追加し、それらを合計しました。「for(;;)」は約12キー幅の前後の動き(ホームキーとキーの間、およびホームキーとSHIFTキーの間)がありますが、「while(TRUE)」は約14キー幅の前後の動きがあります。第4。

ただし、後者を入力するときは、エラーが発生しにくくなります。私は一度に言葉で考えるので、「nIdx」などの頭字語よりも「nIndex」のようなものを入力する方が速いと思います。なぜなら、文字を頭の中で話し、指を自動化するのではなく、実際に精神的に綴る必要があるからです。 -単語を入力します(自転車に乗るなど)

(私のTypingTest.comベンチマーク= 136 WPM)

6
Mike Dunlavey 2010-04-10 14:36.

すべての良い答え-動作はまったく同じである必要があります。

ただし、違いが生じたと仮定してください。それらの1つが反復ごとにさらに3つの命令を受け取ったとします。

気にする必要がありますか?

ループ内で行うことがほとんど何もない場合にのみ、ほとんどの場合はそうではありません

私のポイントは、ミクロ最適化とマクロ最適化があるということです。マイクロ最適化は、「散髪して体重を減らす」ようなものです。

5
Clifford 2010-04-10 12:34.

価値のあるコンパイラが別のコードを生成することは想像できません。たとえそうだったとしても、より効率的な特定のコンパイラをテストせずに決定する方法はありません。

ただしfor(;;)、次の理由からお勧めします。

  • 私が使用した多くのコンパイラは、適切な警告レベル設定でwhile(true)の定数式警告を生成します。

  • あなたの例では、マクロTRUEが期待どおりに定義されていない可能性があります

  • 無限の多くの可能なバリエーションがありますwhileループのようなwhile(1)while(true)while(1==1)など。そのためfor(;;)、一貫性が向上する可能性があります。

5
Armada 2013-02-24 12:15.
for(;;Sleep(50))
{
    // Lots of code
}

以下よりも明確です:

while(true)
{
    // Lots of code
    Sleep(50);
}

を使用していない場合、これは当てはまりませんSleep()

4
Thomas Matthews 2010-04-10 12:14.

「永久」ループは、組み込みシステムでバックグラウンドループとして人気があります。一部の人々はそれを次のように実装します:

for (; ;)
{
 // Stuff done in background loop
}

そして時々それは次のように実装されます:

while (TRUE /* or use 1 */)
{
 // Stuff done in background loop
}

そして、さらに別の実装は次のとおりです。

do
{
 // Stuff done in background loop
} while (1 /* or TRUE */);

最適化コンパイラは、これらのフラグメントに対して同じまたは類似のアセンブリコードを生成する必要があります。重要な注意事項:これらのループは永久に続くため、ループの実行時間は大きな問題ではなく、処理セクションにより多くの時間が費やされます。

3
nik 2010-04-11 05:16.

while(true)はfor(;;)よりも読みやすいと思います-プログラマーがforループで何かを見逃しているように見えます:)

2
Ignacio Cortorreal 2013-07-02 04:54.

「for(;;)」を使用する最も重要な理由は、探索的プログラミングを行うときに「while(TRUE)」を使用することへの恐れです。「for」を使用すると繰り返しの量を制御するのが簡単になり、「for」ループを無限に変換するのも簡単になります。

たとえば、再帰関数を作成している場合、無限ループに変換する前に、関数への呼び出しの量を制限できます。

    for(int i=0;i<1000;i++) recursiveFunction(oneParam);

関数に確信が持てたら、それを無限ループに変換します。

    for(;;) recursiveFunction(oneParam);

Related questions

MORE COOL STUFF

「水曜日」シーズン1の中心には大きなミステリーがあります

「水曜日」シーズン1の中心には大きなミステリーがあります

Netflixの「水曜日」は、典型的な10代のドラマ以上のものであり、実際、シーズン1にはその中心に大きなミステリーがあります.

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ケイト・ミドルトンは、州の夕食会と州の訪問中にカミラ・パーカー・ボウルズからスポットライトを奪いたくなかった、と専門家は言う.

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンが、オリビア・ワイルドが彼女とハリー・スタイルズとの間の「難しい」が「非常に友好的」な分割を恒久的にすることを望んでいる理由を見つけてください.

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする 

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする&nbsp;

エリザベス女王の死後、ケイト・ミドルトンが舞台裏で「非常に困難な時期」を過ごしていたと伝えられている理由を調べてください.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

Total War:Warhammer:Kotakuレビュー

Total War:Warhammer:Kotakuレビュー

私はこのゲームを嫌う準備ができていました。先週の前に、Total War:Warhammerについての私の考えがありました:それでもここに私は、私の手にある完成品であり、私は変わった男です。

涙の道:軍事化された帝国主義勢力がスタンディングロックキャンプを占領

涙の道:軍事化された帝国主義勢力がスタンディングロックキャンプを占領

スタンディングロックスー族のメンバーと水の保護者は、ノースダコタ州のスタンディングロックにあるオセティサコウィンキャンプを去ります。(Twitter経由のCNNスクリーンショット)火と煙がスカイラインを覆い、スタンディングロックスー族のメンバーと水の保護者が、聖なるものを守りながら建てた家、オセティサコウィン(セブンカウンシルファイアーズ)キャンプから行進し、太鼓を打ち、歌い、祈りました。ダコタアクセスパイプラインとしても知られる「ブラックスネーク」からの土地。

シアーズとKマートはイヴァンカ・トランプの商品を自分たちで取り除いています

シアーズとKマートはイヴァンカ・トランプの商品を自分たちで取り除いています

写真:APシアーズとKマートは、イヴァンカ・トランプのトランプホームアイテムのコレクションも、誰も購入したくないために削除しました。シアーズとKマートの両方の親会社であるシアーズホールディングスは、土曜日のABCニュースへの声明で、彼らが気にかけていると辛抱強く説明しましたトランプラインを売り続けるにはお金を稼ぐことについてあまりにも多く。

ポテトチップスでたった10分でスペインのトルティーヤを作る

ポテトチップスでたった10分でスペインのトルティーヤを作る

伝統的なスペインのトルティーヤは通常、オリーブオイルで柔らかくなるまで調理されたポテトから始まります(30分以上かかる場合があります)が、ケトルで調理されたポテトチップスの助けを借りてわずか10分でテーブルに置くことができます。上のビデオはすべてがバラバラにならないように裏返す方法を含め、レシピ全体を説明しますが、必要なのは4〜5個の卵と3カップのケトルチップスだけです。

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、子供向けのパズルの本の序文を書き、ジョージ王子、シャーロット王女、ルイ王子と一緒にテキストを読むと述べた.

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

Yak's Produce は、数十個のつぶれたメロンを野生動物のリハビリ専門家であるレスリー グリーンと彼女のルイジアナ州の救助施設で暮らす 42 匹の動物に寄付しました。

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

8 枚目のスタジオ アルバムのリリースに向けて準備を進めているデミ ロヴァートは、「スーパー グレート ガイ」と付き合っている、と情報筋は PEOPLE に確認しています。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

ホームオフィスのセットアップ術を極めよう!AppExert の開発者は、家族全員が一緒にいる場合でも、在宅勤務の技術を習得しています。祖父や曽祖父が共同家族で暮らしていた頃の記憶がよみがえりました。

2022 年、私たちのデジタル ライフはどこで終わり、「リアル ライフ」はどこから始まるのでしょうか?

20 年前のタイムトラベラーでさえ、日常生活におけるデジタルおよびインターネットベースのサービスの重要性に驚くことでしょう。MySpace、eBay、Napster などのプラットフォームは、高速化に焦点を合わせた世界がどのようなものになるかを示してくれました。

ニューロマーケティングの秘密科学

ニューロマーケティングの秘密科学

マーケティング担当者が人間の欲望を操作するために使用する、最先端の (気味が悪いと言う人もいます) メソッドを探ります。カートをいっぱいにして 3 桁の領収書を持って店を出る前に、ほんの数点の商品を買いに行ったことはありませんか? あなたは一人じゃない。

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

私たちが住んでいる世界を確実に理解するには、データが必要です。ただし、空間参照がない場合、このデータは地理的コンテキストがないと役に立たなくなる可能性があります。

Language