Si su aplicación está pasando alrededor de 700 bytes de mensajes XML que podrían estar contenidos en 65 bytes de los mensajes de protocolo de Google o 85 bytes de ASN.1, entonces probablemente no va a importar. Pero si está procesando un millón de cosas por segundo, entonces no descartaría el costo de agregar 2 ciclos completos de escritura modificada de lectura (RMW) al pasar un puntero.
Una escritura de modificación de lectura completa es del orden de 50 ns, por lo que dos son 100 ns. Este costo es el costo de un lock-inc y un lock-dec, lo mismo que 2 CAS's. Esta es la mitad de una reserva y publicación de la sección crítica de Windows.Esto se compara con un único impulso de ciclo de máquina (400 segundos PICO en una máquina de 2.5GHz)
Y esto ni siquiera incluye los otros costos para invalidar la línea de caché que contiene realmente el conteo, los efectos del bloqueo de BUS en otros procesadores, etc. etc.
Pasar punteros inteligentes por referencia de referencia casi SIEMPRE es preferible. Si el destinatario no crea un nuevo puntero compartido cuando quiere -garantizar o controlar- la vida del pointee , entonces es un error en el destinatario. Para ir de un lado a otro, pasar el hilo de seguridad de una referencia segura, contar punteros inteligentes por valor solo es pedir golpes de rendimiento.
El uso de punteros contados de referencia simplifica los tiempos de vida sin duda, pero pasar los punteros compartidos por valor para tratar de proteger contra los defectos en el destinatario es una completa y absoluta tontería.
El uso excesivo del conteo de referencias puede convertir rápidamente un programa esbelto que puede procesar mensajes de 1 mm por segundo (mps) en uno gordo que maneja 150k mps en el mismo hardware. De repente, necesitas medio rack de servidores y $ 10000/año en electricidad.
Siempre estará mejor si puede administrar la vida útil de sus objetos sin contar las referencias.
Un ejemplo de una mejora simple es, por ejemplo, si va a desplegar un objeto y conoce la amplitud del incremento (por ejemplo n) incrementado en n en lugar de incrementarlo individualmente en cada despliegue.
BTW cuando la CPU ve un prefijo de bloqueo, realmente dice "Oh no, esto va a doler".
Dicho todo esto, estoy de acuerdo con todos que debe verificar el punto caliente.
Heh. No hay respuesta aquí, pero me encantó la forma en que se redactó el título. Me imagino a la CPU ejecutando alegremente instrucciones cuando de repente ve una instrucción de puntero compartido entrar en la parte posterior de la tubería. "Oh no, esto va a huuuuurt ...... ¡OW!" –
¿Qué te hace pensar que el problema son los punteros compartidos? –
Tener gente diciendo que pierden tiempo de CPU, eso es todo: P – Guest