Normalmente programo multi-hilo (programación paralela).
Te pongo un ejemplo para mostrarte el motivo del paralelismo.
Aplicación que lee datos desde un archivo y tiene que almacenarlo en una base de datos. Tiempo de proceso:
1. Aplicación original, más de 50min
2. Aplicación multi-hilo, menos de 15seg.
No se puede llegar y opinar sin tener conocimiento de causa.
Saludo
Hola Jacosito,
Resulta que aunque en mi vida laboral no me he dedicado apenas a la programación,
estudié programación (eso sí, en los tiempos de los Pentium 2/3, no existían procesadores multihilo ni multinúcleo).
Cosas de la vida, tengo un proyecto personal que estoy programando en visual studio en C#, tirando de BD de SQL, y he usado programación multihilo, así que creo que puedo opinar al respecto si me lo permites. Este proyecto implica lectura de ficheros del disco duro, procesamiento de los mismos, OCR, escaneo de carpetas, lectura y escritura tanto en la BD como en ficheros excel, leer y crear nuevos PDFs, separarlos en páginas, unirlos, ordenarlos en un árbol de carpetas del disco duro según su contenido... etc.
Para empezar, que me digas que una aplicación original tarda 50 minutos y que la multihilo son 15 segundos es un absurdo total, más que nada porque suponiendo una eficiencia del multihilo del 100% (del todo irreal), necesitarías un procesador de:
50 minutos = 3000 segundos
3000/15 = 200 núcleos.
Ya me dirás que procesador tienes de 200 núcleos.
Después, decir que la programación multihilo es un dolor de huevos total, requiere un nivel de abstracción mucho mayor, control enorme de los datos para la separación de las tareas y que ninguna acceda a un dato que ha podido ser modicado por otra de las tareas, etc. Seguro que para ti es muy sencillo, que eres un crack, pero para las personas normales como yo, imagino que incrementa bastante la complejidad de la programación. A veces es simplemente imposible paralelizar porque necesitas que un proceso "cocine" unos datos antes de que otro haga otra cosa con ellos.
Pero vamos, obviando eso, digamos que un buen programador a estas alturas debe saber hacer eso y hacerlo, porque programar para un núcleo a estas alturas es una "catetez" y una chapuza.
Basándome en mi experiencia te puedo decir:
En cuanto al rendimiento, todo lo que sea acceder a datos del disco duro NO es realmente paralelizable, y si lo haces en el mejor de los casos te quedarás con el mismo rendimiento, pero es posible que hasta pierdas si te pones a leer diferentes ficheros del mismo disco a la vez (me ha pasado). Yo tengo partes del programa así, preparadas para lanzar tantos procesos como hilos lógicos tenga la CPU, y funciona y gana rendimiento, pero porque además de leer el fichero realizo operaciones con esos datos, y en ese caso cada núcleo o hilo procesa en paralelo esos datos.
Tampoco puedes ponerte por ejemplo a escribir/acceder a en un mismo fichero con varios hilos, aunque sí que puedes hacer el tratamiento de datos en memoria y una vez tengas el resultado a escribir, escribirlo todo mas rápido.
Si mal no recuerdo, leyendo datos de un excel enorme, procesándolos y volcándolos a SQL, en multinúcleo tenía una mejora de rendimiento de 4x (pasar de 10 minutos a 2,5 por ejemplo), el problema es que esto escala bien de un núcleo a dos o cuatro, pero a partir de ahí... te lo digo porque cambié por aquel entonces mi 6600k@4,5Ghz por un 3800x, y los tiempos de proceso eran muy similares.
En otras tareas mas o menos lo mismo, de las cosas que hacía mi programa, lo más paralelizable era el OCR de ficheros, donde la librería que encontré para hacerlo era monohilo, así que con el 3800x puedo hacer OCR a 16 imágenes a la vez, pero ni de coña era 16x mas rápido (tendía que recordar tiempos de test), pero es que ni 8x (por no contar con el SMT).
En los demás procesos, diseñados totalmente por mí y con código mio, a pesar de currarme procesos que descomponían el procesado de datos en tantos hilos como disponía el procesador, diría que la mejora máxima que vi fué de 5x.
También había procesos que al tirar de SMT (16 hilos en mi caso) tardaban más que al no usarlo (8 hilos), de ahí que estos procesos los limitase a tantos como núcleos físicos de la CPU (no lógicos).
Programar en multihilo supone que tanto disco duro como RAM se pueden convertir en un importante cuello de botella, sin olvidar por supuesto el procesamiento "extra" que se llevan los procesos orientados a ordenar y descomponer los datos de forma que se puedan procear en paralelo (multithread overhead creo que lo llaman).
Por cierto, todas estas pruebas que hice eran con un SSD nmve Samsung 970 Evo Plus, o sea, que no te hablo de un disco "malo", con un disco mecánico sería un puto desastre.
En fin, que yo soy el defensor Nº 1 de la programación multinúcleo, pero que la he llevado a cabo y aprovechar más de 4 núcleos es complicado en mi experiencia, a no ser que tengas varios procesos prácticamente independientes que no necesiten estar comunicados y que dependan únicamente de potencia de CPU.
Un saludo