23
for (i=0 ; i<=10; i++)
{
    ..
    ..
}

i=0;
while(i<=10)
{
    ..
    ..
    i++;
}

for ループと while ループでは、どちらがパフォーマンス的に優れていますか?

4

6 に答える 6

49

(更新)実際には、for構成がより効率的なシナリオが1つあります。配列でループします。条件で使用する限り、 コンパイラ/JIT にはこのシナリオの最適化があります。arr.Length

for(int i = 0 ; i < arr.Length ; i++) {
    Console.WriteLine(arr[i]); // skips bounds check
}

この非常に特殊なケースでは、範囲外にならないことが既にわかっているため、境界チェックをスキップします。興味深いことに、「ホイスト」arr.Lengthして手動で最適化しようとすると、これが発生しなくなります。

int len = arr.Length;
for(int i = 0 ; i < len ; i++) {
    Console.WriteLine(arr[i]); // performs bounds check
}

ただし、他のコンテナー (List<T>など) では、巻き上げは手動のマイクロ最適化としてかなり合理的です。

(更新終了)


ない; とにかく、 for ループは内部で while ループとして評価されます。

たとえば、ECMA 334 (明確な割り当て) の 12.3.3.9 では、for ループが次のように規定されています。

for ( for-initializer ; for-condition ; for-iterator ) embedded-statement

本質的に同等です(明確な割り当ての観点から(「コンパイラーはこのILを生成する必要がある」と言うのとまったく同じではありません)):

{
    for-initializer ;
    while ( for-condition ) {
        embedded-statement ;
        LLoop:
        for-iterator ;
    }
}

for ステートメントを対象とする continue ステートメントを使用して、ラベル LLoop を対象とする goto ステートメントに変換します。for ステートメントから for 条件が省略されている場合、上記の展開で for 条件が true に置き換えられたかのように、明確な代入の評価が続行されます。

さて、これはコンパイラがまったく同じことをしなければならないという意味ではありませんが、実際にはほとんどそうです...

于 2009-02-16T09:48:26.133 に答える
12

それらは同じであり、とにかくそのようなマイクロ最適化を行うべきではありません。

于 2009-02-16T09:49:28.080 に答える
6

性能は同じになります。iただし、ループの外で変数にアクセスする必要がない限り、ループを使用する必要がありforます。iブロック内にのみスコープがあるため、これはよりクリーンになります。

于 2009-02-16T09:52:42.380 に答える
4

プログラムの効率は、適切なアルゴリズム、優れたオブジェクト設計、スマートなプログラム アーキテクチャなどからもたらされます。

for ループと while ループを使用して 1 サイクルまたは 2 サイクルを短縮しても、遅いプログラムが速くなったり、速いプログラムが遅くなったりすることは決してありません。

このセクションでプログラムのパフォーマンスを向上させたい場合は、ループを部分的に展開する方法 (「ダフのデバイス」を参照)、またはループ内で実行されることのパフォーマンスを向上させる方法を見つけてください。

于 2009-02-18T18:41:40.700 に答える
2

どちらでもない。それらは同等です。「for」ループは、while ループをよりコンパクトに記述する方法であると考えることができます。

于 2009-02-16T09:48:34.447 に答える
-1

はい、同等のコード スニペットです。

于 2009-02-16T09:51:28.763 に答える