Menu
Coddy logo textTech

Loop Performance

CoddyのC#ジャーニー「ロジックとフロー」セクションの一部 — レッスン 13/66。

ループのパフォーマンスを最適化することで、アプリケーションの速度を大幅に向上させることができます。特に大規模なデータセットの場合に効果的です。

ループ前にコレクションの長さを変数に格納します:

int[] numbers = { 1, 2, 3, 4, 5 };
int length = numbers.Length; // 長さを一度だけ保存

for (int i = 0; i < length; i++) // 保存された値を使用
{
    Console.WriteLine(numbers[i]);
}

ループ条件でのメソッドの繰り返し呼び出しを避ける、例えば:

for (int i = 0; i < GetCount(); i++)
{
    // Loop body
}

GetCount() メソッドはループの各イテレーションで呼び出されます。これは、ループが 1000 回実行される場合、GetCount() も 1000 回実行されることを意味します。なぜなら、ループ条件は各イテレーションの前に評価されるからです。

正しい方法は以下の通りです:

int count = GetCount();
for (int i = 0; i < count; i++)
{
    // Loop body
}

GetCount() はループが開始される前に1回だけ呼び出され、その値が count 変数に格納されます。次に、ループはこの格納された値を使用してすべての反復を実行し、メソッドを繰り返し呼び出す必要を排除します。

このアプローチは、冗長な操作を減らすことでコードの実行を速くし、特に呼び出されるメソッドが複雑な計算やデータアクセスを行う場合に有効です。

challenge icon

チャレンジ

簡単

optimizedSum という名前のメソッドを作成してください。このメソッドは:

  1. 整数配列をパラメータとして受け取る
  2. すべての要素の合計を計算する
  3. 最適化されたアプローチと非最適化されたアプローチの両方を実装する:
    • 非最適化:ループの各イテレーションで array.Length を呼び出す
    • 最適化:ループ前に長さをキャッシュする
  4. 最適化されたアプローチからの結果を返す

チートシート

ループ前にコレクションの長さを変数に格納して、プロパティへの繰り返しのアクセスを避ける:

int[] numbers = { 1, 2, 3, 4, 5 };
int length = numbers.Length; // Store length once

for (int i = 0; i < length; i++) // Use stored value
{
    Console.WriteLine(numbers[i]);
}

ループ条件でのメソッドの繰り返し呼び出しを、結果をキャッシュすることで避ける:

// Inefficient - method called every iteration
for (int i = 0; i < GetCount(); i++)
{
    // Loop body
}

// Optimized - method called once
int count = GetCount();
for (int i = 0; i < count; i++)
{
    // Loop body
}

自分で試してみよう

public class OptimizedSum
{
    // optimizedSum メソッドを実装する
    public static int optimizedSum(int[] numbers)
    {
        // ここにコードを書いてください
        
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン