¿Por qué la gente dice que Java es lento?

Uno de los dichos que aún escuchas hoy en día de otros desarrolladores es que no solo Java es lento, sino que Reflection es una parte excepcionalmente lenta del JDK. Esta publicación está dirigida a aquellos que creen eso o desean tener una conversación constructiva con los creyentes.

Los temas técnicos presentados en esta publicación tienen años de antigüedad, pero de alguna manera algunas de las cosas son sorprendentes cuando las descubres. Así que incluso si eres un desarrollador Java experimentado, puedes encontrar algunos puntos interesantes aquí.

¿Cómo puede alguien medir que la reflexión es lenta? El primer pensamiento es ejecutar una aplicación de evaluación comparativa. Esto podría hacerse tan simple como sigue.

inicio largo = System.nanoTime ();
method.invoke (“reflexión”);
parada larga = System.nanoTime ();

inicio largo = System.nanoTime ();
“reflexión” .length ();
parada larga = System.nanoTime ();

Los resultados son bastante obvios: la versión de reflexión tarda unos 15000 nano segundos, que es de 15 microsegundos; La invocación del método toma 2.2 microsegundos, que es aproximadamente 7 veces más rápido .

¿Pero fue realmente una prueba limpia, que nos muestra resultados reales? Resulta que no exactamente. La prueba estaba lejos de ser limpia. Lo más obvio es que, por primera vez, los resultados serán más lentos, debido a la posible Carga de clases , la inicialización y otras actividades, lo que puede resultar en la creación de objetos excesivos y la invocación de la recolección de basura .

Porque la experiencia global para ellos es lenta.

Java es el código interpretado. Si consideras la ejecución del código solo, se ejecuta muy rápido. Sin embargo, la mayoría de las veces, la JVM tarda mucho tiempo en iniciarse e inicializarse. Esto es cierto tanto para el servidor web como para su teléfono Android. No es como un código C que se ejecuta directamente en el entorno. Como resultado, cada vez más RAM y potencia de procesamiento crean la experiencia de velocidades de ejecución mejoradas; pero nunca toca la experiencia de una ejecución de código nativo.

El JIT siempre será un cuello de botella, especialmente para aplicaciones en tiempo real. Si piensas así, Java es lento. Pero es lo suficientemente rápido para todos los demás usos, como se puede ver con su popularidad. Ningún otro lenguaje tocó todos los aspectos de la vida de las personas como lo hizo Java.

Porque no se compila directamente al hardware, sino a un bytecode intermedio ejecutado por algún otro programa. En las primeras versiones de Java, ese era un intérprete, que era significativamente más lento que el código nativo. Pero desde 1999, el compilador “Justo a tiempo” de Hotspot JVM traduce las secciones de código ejecutadas con mayor frecuencia al código de máquina de la CPU, para ejecutarse sin formato, desnudo y rápido.

En el mundo VM / JIT, la JVM está en la parte superior en velocidad sintonizada. Nadie más que PyPy o Racket puede superar eso. Los idiomas en la JVM siguen siendo los más accesibles debido a la cantidad de bibliotecas con que cuenta, y la JVM sigue siendo (y seguirá siendo) el pilar de la gran programación de TI.

Edit : crédito a Toby Thain por corregir mi meandros mentales después del trabajo. Este hombre ha traducido correctamente las emisiones de mi mente a lo que realmente quería decir.

Dios te bendiga, Toby.

La respuesta de Wesley Bitomski da la verdad técnica.

Pero ya que pregunta por el “comportamiento humano”: supongo que es porque Java se ganó esa reputación hace casi 20 años, y como muchas otras creencias falsas en informática, sigue siendo un meme inmortal.

Java no se ejecuta particularmente lento. Pero la JVM tarda mucho tiempo en iniciarse.

Si está intentando escribir programas que se ejecutan en un sistema operativo de escritorio normal (es decir, Windows, Unix o MacOS, que todavía no se está ejecutando de forma continua), el tiempo de inicio es notablemente peor que para los programas escritos en compilado completamente lenguajes como C u otros scripts de bytecode como Python.