Optimización del rendimiento de aplicaciones C#: guía para principiantes

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: Por qué el rendimiento es importante desde las primeras líneas de código



Cada desarrollador, incluso principiante, se enfrenta a una situación en la que una aplicación simple comienza a ralentizarse, consumir demasiada memoria o tardar mucho en procesar solicitudes. La optimización del rendimiento de las aplicaciones C# no es magia ni es exclusiva de los desarrolladores senior. Es un conjunto de reglas prácticas y herramientas que se pueden dominar en cualquier etapa del aprendizaje.



En este artículo, analizaremos los aspectos clave de la optimización del código en C# (.NET). Aprenderá cómo evitar errores típicos de principiantes, acelerar el trabajo con memoria, cadenas y colecciones, y también cómo usar correctamente el multihilo. El material está dirigido a desarrolladores que ya están familiarizados con los conceptos básicos de la sintaxis de C# y quieren escribir código más eficiente.



1. Trabajo con cadenas: por qué String es malo y StringBuilder es bueno



Uno de los problemas de rendimiento más comunes en C# es el manejo incorrecto de cadenas. Las cadenas en .NET son inmutables. Esto significa que cualquier operación de concatenación crea un objeto de cadena nuevo en la memoria, mientras que el objeto antiguo queda a merced del recolector de basura.



Problema: concatenación en un bucle



Consideremos un mal ejemplo:



string result = "";for (int i = 0; i < 1000; i++){    result += i.ToString() + " ";}// ¡Aquí se crean 1000 cadenas intermedias!


Cada iteración del bucle crea una nueva cadena. Para 1000 iteraciones, eso son 1000 asignaciones de memoria. Si hay 100,000 iteraciones, la aplicación podría "colgarse" o provocar un OutOfMemoryException.



Solución: usamos StringBuilder



La clase StringBuilder trabaja con un búfer de caracteres mutable. No crea nuevos objetos cada vez que se añade texto.



using System.Text;

StringBuilder sb = new StringBuilder();for (int i = 0; i < 1000; i++){ sb.Append(i); sb.Append(" ");}string result = sb.ToString();


Consejo: Use siempre StringBuilder si realiza más de 3-5 operaciones de concatenación, especialmente dentro de bucles. Para la simple unión de varias cadenas (por ejemplo, string s = a + b + c;), el compilador de C# lo optimiza automáticamente en una sola llamada a string.Concat, por lo que aquí no se necesita StringBuilder.



2. Optimización de LINQ: elegir los métodos correctos



LINQ (Language Integrated Query) es una herramienta poderosa, pero su uso incorrecto puede ralentizar mucho la aplicación. El problema principal es la enumeración múltiple de colecciones.



Ejemplo de una consulta LINQ "costosa"



var numbers = Enumerable.Range(1, 1000000);var countEven = numbers.Where(n => n % 2 == 0).Count();// Aquí Where() crea un iterador, Count() lo recorre.// Todo está bien si la colección se recorre una sola vez.


El error ocurre cuando se llaman varias operaciones terminales (Count, ToList, First, Any) sobre la misma expresión LINQ:



var query = numbers.Where(n => n % 2 == 0);int count1 = query.Count(); // Primer recorridoint count2 = query.Count(); // ¡Segundo recorrido!// La colección se recorre dos veces.


Cada llamada a Count() o ToList() vuelve a ejecutar el filtro. Si tiene un filtro complejo o la fuente de datos es una base de datos (Entity Framework), esto provoca consultas duplicadas.



Enfoque correcto: materialización



Si necesita usar el resultado de una consulta varias veces, guárdelo en una lista o array:



var query = numbers.Where(n => n % 2 == 0).ToList(); // Un solo recorridoint count1 = query.Count;int count2 = query.Count;


Consejo: Use .ToList() o .ToArray() inmediatamente después del filtrado si va a llamar a varios métodos (Count, First, Sum). Para una sola llamada, déjelo como está.

Blogs

Book Recommendations