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 変数に格納されます。次に、ループはこの格納された値を使用してすべての反復を実行し、メソッドを繰り返し呼び出す必要を排除します。
このアプローチは、冗長な操作を減らすことでコードの実行を速くし、特に呼び出されるメソッドが複雑な計算やデータアクセスを行う場合に有効です。
チャレンジ
簡単optimizedSum という名前のメソッドを作成してください。このメソッドは:
- 整数配列をパラメータとして受け取る
- すべての要素の合計を計算する
- 最適化されたアプローチと非最適化されたアプローチの両方を実装する:
- 非最適化:ループの各イテレーションで array.Length を呼び出す
- 最適化:ループ前に長さをキャッシュする
- 最適化されたアプローチからの結果を返す
チートシート
ループ前にコレクションの長さを変数に格納して、プロパティへの繰り返しのアクセスを避ける:
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)
{
// ここにコードを書いてください
}
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
1Multi-dimensional Arrays
2D Arrays BasicsDeclaring and Initializing 2DAccessing 2D Array ElementsNested Loops with 2D ArraysJagged ArraysCommon Matrix OperationsRecap - Multi-dimensional4Flow Control Techniques
Early ReturnsGuard ClausesJump Statements (goto)Break and ContinueFlatten Nested Conditionals7Logical Operators Advanced
Short-Circuit EvaluationConditional Logical OperatorsOperator PrecedenceRecap - Advanced Operators2Advanced Decision Making
Multiple ConditionsComplex Boolean LogicIf vs. Switch ComparisonNested Switch StatementsRecap - Advanced Decisions5Exception Handling
Try-Catch BasicsException TypesMultiple Catch BlocksWorking with FilesFinally BlockUsing vs. Try-FinallyCustom ExceptionsRecap - Error Handling3Loop Enhancements
Loop PerformanceIterating ComplexEach Loop TypeRefactoring LoopsRecap - Optimized Loops6Null Handling
Null Reference BasicsNullable Value TypesNull Checking PatternsDefensive ProgrammingRecap - Null Safety