Rendimiento de bucles
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 tu aplicación, especialmente con grandes conjuntos de datos.
Almacena la longitud de la colección en una variable antes del bucle:
int[] numbers = { 1, 2, 3, 4, 5 };
int length = numbers.Length; // Almacenar la longitud una vez
for (int i = 0; i < length; i++) // Usar el valor almacenado
{
Console.WriteLine(numbers[i]);
}Evita llamadas repetidas a métodos en las condiciones de los bucles, por ejemplo:
for (int i = 0; i < GetCount(); i++)
{
// Cuerpo del bucle
}El método GetCount() se llama en cada iteración del bucle. Esto significa que, si el bucle se ejecuta 1000 veces, GetCount() también se ejecutará 1000 veces, porque la condición del bucle se evalúa antes de cada iteración.
Así es como se hace 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. Después, el bucle utiliza este valor almacenado en todas las iteraciones, eliminando la necesidad de llamar repetidamente al método.
Este enfoque puede hacer que tu código se ejecute más rápido al reducir las operaciones redundantes, especialmente cuando el método que se llama realiza cálculos complejos o accede a datos.
Desafío
FácilCrea un método llamado optimizedSum que:
- Acepte una matriz de enteros como parámetro
- Calcule la suma de todos los elementos
- Implemente un enfoque optimizado y uno no optimizado:
- No optimizado: llama a array.Length en cada iteración del bucle
- Optimizado: almacena en caché la longitud antes del bucle
- Devuelva el resultado del enfoque optimizado
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
1Arrays multidimensionales
Conceptos básicos de arrays 2DDeclaración e inicialización de arrays 2DAcceso a elementos de arrays 2DBucles anidados con arrays 2DArrays irregularesOperaciones comunes con matricesRepaso: arrays multidimensionales4Técnicas de control de flujo
Retornos anticipadosCláusulas de guardaSentencias de salto (goto)Break y ContinueAplanar condicionales anidados7Operadores lógicos avanzados
Evaluación de cortocircuitoOperadores lógicos condicionalesPrecedencia de operadoresRepaso: operadores avanzados2Toma de decisiones avanzada
Múltiples condicionesLógica booleana complejaComparación entre If y SwitchSentencias Switch anidadasRepaso: decisiones avanzadas5Manejo de excepciones
Fundamentos de Try-CatchTipos de excepcionesMúltiples bloques CatchTrabajo con archivosBloque FinallyUso de Using frente a Try-FinallyExcepciones personalizadasRepaso: manejo de errores3Mejoras de bucles
Rendimiento de buclesIteración de estructuras complejasCada tipo de bucleRefactorización de buclesRepaso: bucles optimizados6Manejo de valores nulos
Conceptos básicos de referencias nulasTipos de valor anulablesPatrones de comprobación de valores nulosProgramación defensivaRepaso: seguridad frente a valores nulosPractica por tu cuenta: Compilador de C# online