Si la característica más importante de Twitter es el tiempo real, ¿por qué optó por Java en lugar de C ++?

Su pregunta deriva de una idea errónea de lo que significa en tiempo real. El tiempo real no significa “lo más rápido posible”. Significa: “el software debe responder dentro de esta ventana de tiempo”. Eso significa que es posible tener un software en tiempo real que, por ejemplo, debe responder al usuario dentro de un plazo de 10 minutos.

Además, hay una diferenciación de tiempo real duro y tiempo real suave. El tiempo real difícil significa que, si el sistema no procesa la solicitud y envía una respuesta dentro de la ventana de tiempo, la respuesta se vuelve inútil. Por otro lado, el tiempo real suave significa que una respuesta aún puede ser útil INCLUSO después de la ventana de tiempo. En el ejemplo de Twitter, incluso si el requisito de la ventana de tiempo de una actualización de tweet es de 1 segundo, si en algunas actualizaciones tarda 5 segundos en responder, probablemente también sea suficiente.

Técnicamente es totalmente posible implementar en tiempo real en Java. Como se puede utilizar para lograr en tiempo real. Entonces, probablemente no optaron por C ++ porque no lo necesitaban.

La JVM ha evolucionado tanto que los programas Java a menudo son más rápidos que los programas C equivalentes. HotSpot optimiza el código por procesador, por revisión.

Por supuesto, si bien el uso de la CPU y el rendimiento de los mensajes pueden ser mayores en Java, el uso de la memoria también será mayor. Además, si está asignando un nuevo objeto para cada mensaje que alguien envía, las pausas del GC pueden durar varios segundos , lo que es inaceptable para aplicaciones en tiempo real. Sin embargo, el marco Netty (lo que usa Twitter) le permite crear buffers directos contados por referencia que residen fuera de la memoria de la JVM, eliminando casi por completo las pausas de GC.

https://blog.twitter.com/2013/ne

Nota al margen: el marco Netty es realmente una obra de arte. Utiliza la clase Java Unsafe para implementar objetos contados por referencia. Esencialmente, dado que Java no pudo evolucionar lo suficientemente rápido, evolucionaron Java.

Se podría argumentar que podrían haberlo escrito en código de máquina (ensamblaje) para mejorar el rendimiento. O al menos C. Pero todo se reduce a lo que es más importante. Nuevas características vs rendimiento. El precio de los procesadores y la memoria baja cada año. Esto significa que el mismo código que escribió hace un año requerirá menos tiempo para ejecutarse hoy. El análisis de costo-beneficio dirá ir con Java. Pague a los programadores que escriben código de bajo nivel o compran hardware nuevo. Teóricamente, los programas no son eficientes, pero es práctico.

También ahora tienen margen de mejora.

Los programadores tienen muchas cosas que pueden hacer en los años venideros. Mejore el tiempo de ejecución de JAVA y todo el mundo se beneficiará. Piense en lo que Android trajo a Java desde que se introdujo.

Nota al margen: las grandes organizaciones prefieren el código legible sobre el código de alto rendimiento, especialmente si el código trata de dinero. Si llega un momento en que no se requieren más funciones, identificarán los módulos clave en toda la base de código que lleva tiempo ejecutar y eventualmente lo reescribirá en un lenguaje de bajo nivel.

Twitter debe estar en tiempo real en una escala de tiempo de respuestas humanas: segundos. Tanto C ++ como Java pueden manejar este nivel de tiempo real con facilidad. Solo cuando las escalas de tiempo son inferiores a milisegundos, C ++ tiene alguna ventaja. Por encima de eso, solo se trata de proporcionar más potencia de procesamiento; Si Java tarda más en realizar una tarea, debe instalar un número proporcionalmente mayor de procesadores. Y Java probablemente será más rápido de desarrollar: si el tiempo de comercialización es importante, Java es una buena opción.

Su pregunta comienza con la premisa de que Java es más lento que C ++, lo cual es dudoso. Además, incluso el gurú más ardiente de C ++ no argumentaría que la diferencia horaria en C ++ frente a Java para hacer lo que hace Twitter sería más que un abrir y cerrar de ojos.