C# の for および foreach のパフォーマンス

C# では、forと は、foreachコレクション内の要素を反復するために一般的に使用される 2 つのループ構造です。これらは機能的には似ていますが、パフォーマンス、スペース効率、ガベージ コレクション (GC) の点でいくつかの違いがあります。以下の説明では、これらの側面を詳細に説明し、関連するコード例を示します。

1. 時間効率:

for一般に、ループはforeachループよりも時間効率が高くなります。これは、forループがインデックスを介してコレクション内の要素に直接アクセスするのに対し、foreachループは反復子を取得して要素に 1 つずつアクセスする必要があるためです。

時間効率の観点からの比較forとサンプルコードは次のとおりです。foreach

// 使用 for 循环迭代集合
for (int i = 0; i < collection.Length; i++)
{
    
    
    var item = collection[i];
    // 处理 item
}

// 使用 foreach 循环迭代集合
foreach (var item in collection)
{
    
    
    // 处理 item
}

この例では、forループはインデックスによってコレクション内の要素に直接アクセスしますが、foreachループは反復子を使用して各要素に順番にアクセスします。したがって、ほとんどの場合、forループの方がforeachループよりも高速になります。

2. スペース効率:

スペース効率の点では、forループとループforeachの間に目立った違いはありません。いずれもメモリ使用量に直接影響するものではありません。forループであってもforeach、ループであっても、余分なメモリ負荷を加えることなく、コレクション内の要素を反復処理するだけです。

3. GC (ガベージコレクション):

GC に関しても、forサイクルとループforeachの間に直接の違いはありません。どちらも、ループ終了後にイテレータと関連リソースを自動的に解放できます。forループを使用するかforeachループを使用するかに関係なく、反復が終了すると、ガベージ コレクターは必要に応じて使用されなくなったオブジェクトを再利用します。

ただし、ループ内で多数の一時オブジェクトが作成される場合、またはタイムリーに解放する必要があるリソースが使用される場合は、これらのオブジェクトまたはリソースをループ内で手動で解放する方が効率的である場合があることに注意してください。この場合、ガベージ コレクションに依存する代わりに、usingステートメントまたは適切なメソッドを使用して、これらのリソースを手動で解放できます。Dispose()

以下は、ループ内でリソースを手動で解放する方法を示すサンプル コードです。

foreach (var item in collection)
{
    
    
    using (var resource = new SomeResource())
    {
    
    
        // 使用 resource
    }
}

この例では、usingステートメントを使用してSomeResourceオブジェクトのライフサイクルを作成および管理します。このようにして、各反復の後、ガベージ コレクターの介入を待たずに、リソースが時間内に解放されます。

要約すると、forループは一般にforeachループよりも高速ですが、ほとんどの場合、両者のパフォーマンスの差は顕著ではありません。最も一般的なアプリケーション シナリオでは、forループとforeachループのどちらを選択するかは、主にコードの読みやすさと意味論的な明確さに依存します。

パフォーマンスと効率の実際の違いは、コレクションのサイズ、反復回数、コードの最適化の程度など、多くの要因の影響を受ける可能性があることに注意してください。したがって、最も適切なループ構造を選択するために、実際のシナリオでベンチマークとパフォーマンスの最適化を実行することをお勧めします。

おすすめ

転載: blog.csdn.net/gangzhucoll/article/details/131757652
おすすめ