Uno de los problemas que más se repite en los programas que manejan muchos datos o que tienen algoritmos complejos, es el tiempo que tarda el sistema en realizar los cálculos y los recursos que necesita. Por esta razón, hoy te enseñamos 3 maneras de optimizar tus programas en C#
Tabla de contenidos
¿Qué es optimizar?
Optimizar es un proceso clave en el mundo empresarial, el cual consiste en reducir los recursos necesarios para alcanzar un objetivo. En este caso queremos reducir el tiempo de computación y la cantidad de memoria, necesaria para ordenar un conjunto de datos grande. La optimización tiene los siguientes problemas:
- Es un proceso complejo, ya que para alcanzar mejoras en el rendimiento, muchas veces, es necesario utilizar estructuras de datos más complejas.
- Requiere definir claramente qué queremos optimizar (memoria, tiempo, uso del disco duro, etc), porque en muchos casos al optimizar un parámetro, empeoramos otros.
- Es necesario conocer a fondo la plataforma y tecnologías que estamos utilizando, para saber qué mejoras son más óptimas.
- El coste de optimizar suele ser logarítmico, al principio se necesita poco tiempo para conseguir mejoras, pero se llega a un punto donde el coste de desarrollar una mejora es muy alto.
Optimizando los tipos de datos
Como sabrás, no todos los tipos de datos se manejan igual de rápido por un procesador. Por ello es imprescindible elegir tanto los tipos de datos simples, como los complejos, más óptimos para nuestro problema. En el caso de C#, nos encontramos con que podemos tener colecciones de documentos usando listas y usando arrays. Aunque para algunos ambos pueden ser usados indistintamente, si en tu problema el número de documentos no va a cambiar y necesitas optimizar, debes utilizar arrays. Esto es debido a que, al ser una colección más simple, realiza las operaciones a más bajo nivel, es decir, evita gran parte de la sobrecarga que tienen las listas.
Paralelizar tareas
Hoy en día, todos los dispositivos que solemos manejar son capaces de trabajar con varios hilos de ejecución. Sin embargo, hay pocos programas que saquen partido a este hecho, un ejemplo de ello son los juegos, ya que muchos de ellos solo son capaces de gestionar hasta 2 o 4 hilos. La programación paralela genera muchos problemas, pero si es bien utilizada, consigue mejoras de rendimiento muy elevadas.
En el caso que estaba trabajando, para ordenar una colección se puede utilizar tanto ordenación secuencial, como ordenación paralela. Por ejemplo el método Array.Sort(), nos ordena nuestro array de manera secuencial, mientras que si usamos PLINQ podemos conseguir un ordenamiento paralelo de la colección.
Programar a más bajo nivel
Programar a más bajo nivel, si eres capaz de trabajar en ese nivel, suele ayudar mucho a optimizar un problema. Pero hoy no os voy a hablar de implementar código en ensamblador para optimizar cálculos (cosa que se hace por ejemplo en OpenSSL). Sino de una serie de consejos que he encontrado útiles, para mejorar el rendimiento:
- No implementar interfaces genéricas. Al implementar una interfaz genérica sin especificar el tipo, se reduce el rendimiento. Esto lo he comprobado con la interfaz IComparable.
- Intentar reducir el uso de LINQ, si bien es una característica muy útil, se ha comprobado que es algo más lenta.
- Transformar las expresiones lambda en código estructurado.
- Compilar tu proyecto para arquitecturas de 64 bits.
Comprobando la optimización lograda, medir, medir y medir
Una vez hemos realizado un conjunto de optimizaciones en nuestro código, debemos tener un conjunto de datos y un método para medir claramente la mejoría lograda. En algunos casos, el comportamiento de una optimización puede ser mejor en unas versiones que en otras, así que es muy util tener un programa encargado de hacer test de rendimientos automáticos.
En mi caso, para demostrar lo expuesto anteriormente, he desarrollado un programa capaz de realizar un pequeño benchmark:
Como podéis ver el mejor método para ordenar mi conjunto de datos, ha sido utilizar PLINQ junto a una colección de datos almacenada en un array.
Para realizar la captura de tiempos, he utiliza la clase Stopwatch, la cual permite medir el tiempo transcurrido con precisión.
¿Has tenido problemas de rendimiento en tus programas? o ¿sabes alguna otra técnica de optimización?, esperamos tu comentario.
Un saludo.
Jorge Durán
Latest posts by Jorge Durán (see all)
- [Remix] Multitud de recursos para .NET - 18 junio, 2021
- ¿Qué es un puntero y cómo se usan? - 4 junio, 2021
- Los 10 mejores paquetes nuget que tienes que instalar - 26 abril, 2021