Loop Performance
Parte de la sección Lógica y Flujo del Journey de C# de Coddy — lección 13 de 66.
Optimizar el rendimiento de los bucles puede mejorar significativamente la velocidad de su aplicación, especialmente con conjuntos de datos grandes.
Almacena la longitud de la colección en una variable antes del bucle:
int[] numbers = { 1, 2, 3, 4, 5 };
int length = numbers.Length; // Almacena la longitud una vez
for (int i = 0; i < length; i++) // Usa el valor almacenado
{
Console.WriteLine(numbers[i]);
}Evite llamadas repetidas a métodos en las condiciones de los bucles, por ejemplo:
for (int i = 0; i < GetCount(); i++)
{
// Loop body
}El método GetCount() se llama en cada iteración del bucle. Esto significa que si el bucle se ejecuta 1000 veces, GetCount() se ejecutará también 1000 veces, porque la condición del bucle se evalúa antes de cada iteración.
Aquí está cómo hacerlo correctamente:
int count = GetCount();
for (int i = 0; i < count; i++)
{
// Cuerpo del bucle
}GetCount() se llama solo una vez antes de que comience el bucle, y su valor se almacena en la variable count. Luego, el bucle usa este valor almacenado para todas las iteraciones, eliminando la necesidad de llamar repetidamente al método.
Este enfoque puede hacer que su código se ejecute más rápido al reducir operaciones redundantes, especialmente cuando el método que se llama realiza cálculos complejos o acceso a datos.
Desafío
FácilCrea un método llamado optimizedSum que:
- Toma un arreglo de enteros como parámetro
- Calcula la suma de todos los elementos
- Implementa tanto un enfoque optimizado como no optimizado:
- No optimizado: Llama a array.Length en cada iteración del bucle
- Optimizado: Almacena en caché la longitud antes del bucle
- Devuelve el resultado del enfoque optimizado
Hoja de referencia
Almacene la longitud de la colección en una variable antes del bucle para evitar el acceso repetido a la propiedad:
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]);
}Evite llamadas repetidas a métodos en las condiciones del bucle almacenando el resultado:
// 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
}Pruébalo tú mismo
public class OptimizedSum
{
// Implementa el método optimizedSum
public static int optimizedSum(int[] numbers)
{
// Escribe tu código aquí
}
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y Flujo
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