La mayoría de los problemas no requieren mucho tiempo de CPU. Realmente, los núcleos individuales son bastante rápidos para muchos propósitos. Cuando descubra que su programa es demasiado lento, primero perfilelo y observe su elección de algoritmos, arquitectura y almacenamiento en caché. Si eso no te da suficiente, trata de dividir el problema en procesos separados. A menudo, esto vale la pena simplemente para el aislamiento de fallas y para que pueda comprender el uso de la CPU y la memoria de cada proceso.Además, normalmente cada proceso se ejecutará en un núcleo específico y hará un buen uso de los cachés del procesador, por lo que no tendrá que sufrir la sobrecarga de rendimiento sustancial de mantener constantes las líneas de caché. Si opta por un diseño de proceso múltiple y todavía encuentra que el problema necesita más tiempo de CPU del que obtiene con la máquina que tiene, está en una buena posición para extenderlo y ejecutarlo en un clúster.
Existen situaciones en las que necesita varios subprocesos dentro del mismo espacio de direcciones, pero tenga en cuenta que los subprocesos son realmente difíciles de corregir. Las condiciones de carrera, especialmente en idiomas no seguros, a veces tardan semanas en depurarse; a menudo, simplemente agregar seguimiento o ejecutar bajo un depurador cambiará los tiempos lo suficiente para ocultar el problema. Simplemente poner cerraduras en todas partes a menudo significa que tienes muchos bloqueos y, a veces, tanta contención de bloqueo que no obtienes la ventaja de concurrencia que esperabas. Incluso cuando tiene el bloqueo correcto, necesita un perfil para sintonizar la coherencia de la caché. En última instancia, si realmente desea sintonizar un código altamente concurrente, probablemente terminará buscando construcciones sin bloqueo y esquemas de bloqueo más complejos que aquellos en las bibliotecas actuales de multi-threading.