Como han sugerido otros ("manzanas y naranjas"), veo estas dos técnicas como ortogonales. La suposición subyacente aquí parece ser que uno elegirá uno u otro: o usaremos recursos bloqueados y compartidos o usaremos el paso de mensajes, y el otro hace innecesario el otro, o tal vez el otro no está disponible .
Al igual que, por ejemplo, un evaluador metacircular, no es obvio cuáles son los verdaderos primitivos aquí. Por ejemplo, con el fin de implementar mensaje de paso, es probable que necesite atomic CAS y semántica de visibilidad de memoria particular, o tal vez algún bloqueo y estado compartido. Uno puede implementar operaciones atómicas en términos de bloqueos, o uno puede implementar bloqueos en términos de operaciones atómicas (como lo hace Java en sus tipos java.util.concurrent.locks
).
Del mismo modo, aunque es cierto que es un estiramiento, uno podría implementar el bloqueo con el envío de mensajes. Preguntar cuál tiene un mejor rendimiento no tiene mucho sentido en general, porque en realidad se trata más de una pregunta sobre qué se construye en términos de qué. Lo más probable es que el que está en el nivel inferior puede manejarse mejor por un programador capaz que el construido en la parte superior —, como ha sido el caso con los autos de transmisión manual hasta hace poco (un debate allí también).
Por lo general, el enfoque de paso de mensajes no es alabado por un mejor rendimiento, sino por seguridad y conveniencia, y generalmente se vende al denegar al programador el control de bloqueo y recursos compartidos. Como resultado, apuesta contra la capacidad del programador; si el programador no puede adquirir un bloqueo, no puede hacerlo mal y ralentizar el programa. Al igual que un debate sobre la gestión manual de la memoria y la recolección de basura, algunos afirmarán ser "buenos conductores", aprovechando al máximo el control manual; otros — especialmente los que implementan y promueven el uso de un recolector de basura — alegarán que, en conjunto, el recolector puede hacer un mejor trabajo que los "controladores no tan buenos" con la gestión manual.
No hay una respuesta absoluta. La diferencia aquí radicará en el nivel de habilidad de los programadores, no con las herramientas que pueden manejar.
¿Es posible que simplemente extienda su pregunta? ¿Qué es exactamente lo que preguntas? ¿Algún ejemplo de caso? Porque la respuesta "real" a su pregunta es como escribir un libro :) - realmente larga –
¿Es esta una comparación justa? ¿No son estas manzanas y naranjas? –
es esta pregunta acerca de cómo comparar el enhebrado tradicional y los enfoques [SEDA] (http://en.wikipedia.org/wiki/Staged_event-driven_architecture)? en caso afirmativo, entiendo que el bloqueo del hilo implica una sobrecarga de rendimiento significativa (vallas de memoria y tal). Puede echar un vistazo a la discusión: [¿Cómo mejorar significativamente el rendimiento de Java?] (Http://programmers.stackexchange.com/questions/96994/how-to-significantly-improve-java-performance) – gnat