Con los servidores actuales de procesadores multinúcleo, el uso de programación concurrente puede aumentar significativamente el rendimiento del código de sus reglas de negocio. Un escenario común donde la concurrencia destaca es al recorrer grandes conjuntos de datos o al realizar tareas repetitivas. Al ejecutar estos bucles con múltiples hilos, podemos dividir el trabajo y procesar fragmentos de datos en paralelo. En esta publicación, hablaremos del “cómo” y el “por qué” del multihilo en bucles For, tanto en reglas de negocio de C# como de VB.NET.

¿Por qué usar multihilo?

  • 1. Rendimiento: En aplicaciones que requieren operaciones intensivas de CPU, como cálculos dentro de un bucle, el multihilo puede aprovechar varios núcleos del procesador, ejecutar procesos de forma concurrente y mejorar la velocidad general de ejecución.
  • 2. Capacidad de respuesta: En aplicaciones con interfaz de usuario, trasladar los bucles que consumen tiempo a un hilo separado mantiene la interfaz receptiva. Esto garantiza que la aplicación siga siendo fácil de usar, incluso durante procesos pesados.
  • 3. Utilización de recursos: El multihilo puede optimizar el uso de recursos. Garantiza que, mientras un hilo espera recursos, por ejemplo operaciones de E/S, otro pueda seguir ejecutándose, evitando que la CPU quede inactiva.

¿Cómo aplicar multihilo a los bucles For?

.NET ofrece varias herramientas para paralelismo, pero por simplicidad nos centraremos en el método Parallel.For proporcionado por el espacio de nombres System.Threading.Tasks.

Ejemplo en VB.NET:

Tomemos un bucle For simple que realiza una operación síncrona, de una en una, intensiva en CPU:

Ejemplo de bucle For síncrono en VB.NET

Para ejecutar este bucle con múltiples hilos usando Parallel.For, el código queda así:

Ejemplo de Parallel.For en VB.NET

Ejemplo en C#:

Ejemplo de Parallel.For en C Sharp

Aspectos a tener en cuenta:

  • 1. No siempre es más rápido: Introducir paralelismo agrega sobrecarga. En bucles pequeños o tareas pequeñas, esa sobrecarga puede anular los beneficios e incluso ralentizar la ejecución. Siempre mida el rendimiento para verificar si el multihilo realmente aporta ventajas.
  • 2. Seguridad de hilos: Cuando varios hilos pueden acceder a datos compartidos al mismo tiempo, pueden producirse condiciones de carrera. Asegúrese de que las operaciones dentro del bucle sean seguras para ejecutarse en paralelo. Si es necesario, utilice bloqueos, pero tenga cuidado con los posibles interbloqueos.
  • 3. Grado máximo de paralelismo: De forma predeterminada, Parallel.For utiliza tantos núcleos del sistema como haya disponibles. Sin embargo, quizá no quiera usar todos los núcleos, especialmente en un sistema compartido. Puede controlarlo configurando MaxDegreeOfParallelism:

Configurar MaxDegreeOfParallelism

Orden

La ejecución en paralelo no garantiza que las iteraciones se ejecuten en orden. Si el orden es crucial, reconsidere si el paralelismo es realmente la mejor opción para su bucle.

En conclusión, ejecutar bucles con múltiples hilos tanto en C# como en VB.NET puede ser una herramienta poderosa para mejorar el rendimiento, especialmente en escenarios intensivos de CPU. Sin embargo, como cualquier herramienta, debe usarse de forma cuidadosa y apropiada, teniendo en cuenta la seguridad de hilos y las necesidades específicas de la aplicación. Pruebe un bucle paralelo en su regla y observe el cambio en el rendimiento.