Loop Performance
Часть раздела Логика и управление потоком путешествия по C# на Coddy — урок 13 из 66.
Оптимизация производительности циклов может значительно улучшить скорость вашего приложения, особенно при работе с большими наборами данных.
Сохраните длину коллекции в переменной перед циклом:
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]);
}Избегайте повторных вызовов методов в условиях циклов, например:
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() вызывается только один раз перед началом цикла, и его значение сохраняется в переменной 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