it-swarm-es.com

¿Por qué la gente todavía dice Java es lento?

Durante mucho tiempo en SO y en otros lugares Java tiene la reputación de ser lento. De chistes a muchos comentarios en preguntas y respuestas, la gente todavía cree que Java es lento basado únicamente en su experiencia en los años 90.

Este es mi problema: tenemos refutado (la mayoría) de las razones por las que la gente cree que Java es lenta. Fuera de las cosas pequeñas, Java es bastante rápido.

Entonces, ¿por qué la gente todavía se niega a creer que Java es rápida ahora? ¿Es parte de su mentalidad que algo que no sea C/C++ es lento? ¿Es porque la gente no controla con el tiempo? ¿Es porque las personas son parciales?

61
TheLQ

Son las aplicaciones. Como notará, nosotros tenemos probamos, una y otra vez, que en escenarios artificiales Java puede cumplir o incluso superar el rendimiento de los llamados lenguajes "performantes" como C, C++, LISP, VB6 o JavaScript. Y cuando se les presente tal evidencia, la mayoría de los opositores sanos y de mente abierta se quedarán boquiabiertos y prometen nunca más difundir tal calumnia.

... pero luego, encienden Eclipse, o NetBeans, o Guiffy, o habilitan el soporte Java en su navegador, o intentan ejecutar una aplicación en su teléfono con funciones favoritas. Y esperan para que se vuelva receptivo ...

...y espera...

...y espera...



...y espera...







...y espera...











...y...




... ¿Qué prometí no volver a hacer nunca más? Lo siento, debe haberme quedado dormido ...

131
Shog9

Esta pregunta opera en premisas falsas: donde cuenta, Java sigue siendo lenta. Donde cuenta son algoritmos de computación pesada en grandes conjuntos de datos. Por supuesto, estos pueden optimizarse, a veces para estar a la par con el código C/C++, pero solo a costa de la modularidad y el carácter genérico. El código eficiente de C++ se puede diseñar para que sea genérico y se pueda usar como una biblioteca de uso general. Java código no puede. Solo mira el muy optimizado Array.sort método, que utiliza diferentes implementaciones para todos los tipos fundamentales, y cuya variante de objeto sigue siendo mucho más lenta que C++ 'genérico sort porque estos objetos tienen que despachar comparaciones de igualdad dinámicamente.

Por supuesto, las optimizaciones justo a tiempo que realiza el motor HotSpot pueden predecir el objetivo de estas llamadas virtuales e intentar la inserción. Pero esto es aún más lento que la llamada directamente en línea que se despacha dentro del método C++ ’sort.

Un antiguo colega mío ha realizado puntos de referencia comparativos de un problema en grandes conjuntos de datos ( q - conteo de gramos usando formas dinámicas) con una implementación de plantilla C++ y un orientado a objetos Java implementación. El código Java código era de órdenes de magnitud más lento que el código C++.

Por supuesto, esto es comparar manzanas con naranjas. Pero el punto es que la implementación Java implementación fue la mejor implementación posible (en términos de rendimiento, dado el grado de modularidad requerido para una biblioteca), y también lo fue la implementación de C++.

Desafortunadamente, los datos de referencia no están disponibles gratuitamente, pero otros han encontrado números similares al comparar la sobrecarga de abstracción de tiempo de ejecución. Por ejemplo, Scott Meyers escribe en STL efectivo sobre la sobrecarga de la función genérica qsort de C:

El tipo de C++ prácticamente siempre avergüenza el qsort de C cuando se trata de velocidad. [...] En tiempo de ejecución, sort realiza llamadas en línea a su función de comparación ... mientras qsort llama a su función de comparación a través de un puntero. [...] En mis pruebas en un vector de un millón de dobles, [ordenar] corrió hasta un 670% más rápido ...

48
Konrad Rudolph

Porque es lento ... en algunas aplicaciones. Las aplicaciones de escritorio tienen que responder desde el principio y la sobrecarga de inicio se considera lenta.

Por otro lado, si ejecuta un servidor, no importa si hay algo de calentamiento (análisis y compilación JIT): lo hace una vez en la luna azul, por lo que la mayoría de las veces no puede considerarse completamente lento.

28
Maciej Piechotka

Yo diría que es porque cuando la gente lo encontró por primera vez, fue lento. En base a eso, formaron una impresión de ello. Es improbable que esa impresión cambie si no la usan, y no la usan debido a esa impresión: es un círculo vicioso.

Debo admitir que tuve la impresión de que Java era lento, y sí, eso fue por mi exposición anterior. Ahora me he mudado a diferentes idiomas y he tenido una exposición extremadamente limitada a Java desde entonces. En consecuencia, mi opinión no ha cambiado mucho.

21
Damovisa

Porque lleva una generación cambiar las percepciones de las personas sobre un producto

No tiene nada que ver con qué tan rápido Java se vuelve. En la mente de las personas Java es un identificador constante asociado con la palabra 'lento'. Hay poco, nada que usted o Oracle puede hacer al respecto.

Simplemente esté feliz de que Oracle no haya destruido la cultura de programación Java (todavía)) al hacer algo imprudente o estúpido . Como cobrar costos de licencia excesivos para usarlo. personas basadas en patentes de software propiedad de Sun. :: suspiro ::

Odio ser el detractor aquí, pero, a menos que Oracle y Google resuelvan la lucha Java en términos agradables, o Google se vea obligado a comprar Java y lo convierte en un plataforma de código abierto 'adecuada', Java está en camino de ser el niño en el patio de juegos que tiene piojos. IE, nadie querrá tocarlo con un poste de 20 pies.

Nota: Para ser claros, cuando digo generación, estoy hablando en términos de personas, no en términos de computadora. Es decir, hasta que las personas que sostienen esa percepción mueran de vejez o sean reemplazadas por una generación más joven, la percepción se mantendrá verdadera. ¡Piense en términos de 5 décadas, no de 5 años

16
Evan Plaice

Una razón es que las personas confían en lo que otros dicen en lugar de lo que ven.

Según lo que me dijeron cuando comencé a programar, Java es "más lento" que C++, y la razón por la cual Java podría usarse es porque es "conveniente y más fácil ". Se cree comúnmente que Java aporta seguridad y conveniencia, a costa del rendimiento. Incluso cuando se inventa C # más adelante, la gente cree que es más rápido que Java porque es "nativo".

Pero la verdad que la gente ve sin sentirlo es que, Eclipse, el IDE que está construido con Java, es absolutamente el MÁS RÁPIDO IDE en clase. usó casi todos los IDE de flujo principal, los de MS y GNU, Borland ..., Eclipse es el rey absoluto de los IDE, en gran parte debido a su rapidez.

Otra razón es su tiempo de inicio largo.

Java no es adecuado para desarrollar una aplicación pequeña que permanezca en la bandeja del sistema, consuma un poco de memoria, abra un cuadro de diálogo que le recuerde tomar un descanso; o un bloc de notas que usa para abrir un archivo de texto, leerlo y cerrarlo. Debe usarse en algo GRANDE, como un servidor web que siempre está ahí, hacer un uso optimizado de su recurso informático, responder a millones de solicitudes cada hora. O un IDE como Eclipse que gestiona miles de archivos de espacio de trabajo. No sabe que Java es rápida hasta que se haya ejecutado durante al menos varias horas, Yo creo.

11
tactoth

@bigown "¿Por qué la gente todavía dice Java es lento?"

Porque son tontos. Porque no tienen experiencia laboral, pero piensan que son la encarnación viva de Dikjstra o la segunda venida de Linus Torvald, oh, no sé. Las razones para decir algo tan retrasado son muchas, pero generalmente la estupidez, el fanboyismo subjetivo y sin sentido, y la atención emocional parecen estar detrás de ellos.

Diseñemos esto para que pueda ver la verdad de lo que acabo de decir arriba:

Primero, qué es lento, en qué contexto, para qué, bajo qué condiciones, con qué propósito de ingeniería/científico/negocio (por decir lo que apesta no es uno de ellos). Cualquier persona que diga " X es lento "para cualquier tecnología X, o simplemente" X es Y "donde Y es algún tipo de afirmación negativa, sin responder ninguna de las preguntas anteriores debe descartarse como un tonto. Declaraciones como esa no tienen lugar en la ingeniería. En política y en salas de chat juveniles, tal vez, pero no en ingeniería.

En segundo lugar, la mayoría de estos tontos equivocados lloran porque Java es lento porque ZOMG, su Eclipse tarda una eternidad en encenderse (caramba, carga la cosa con todos los complementos y adivina qué sucede). de estos tontos ni siquiera saben cómo ajustar el jvm para que Eclipse funcione rápidamente (o para cualquier aplicación Java para el caso). Es decir, no tienen idea sobre el ajuste del rendimiento, que es una realidad no solo para Java, sino para cualquier sistema no trivial, ya sea hardware o software, por lo tanto, allí mismo, se desarman por cualquier validez técnica para hacer tales declaraciones sin sentido.

En tercer lugar, consideremos para qué sirve el desarrollo de Java desarrollo: back end OLTP en primer lugar; monitorear los sistemas en segundo lugar. Cualquier tipo de sistema está destinado a se ejecutan en grupos y se ejecutan sin interrupciones durante semanas, si no meses. ¿Realmente importa entonces que su pequeña aplicación Eclipse o de juguete tarde uno o dos minutos en cargarse cuando el propósito de REAL Java aplicaciones es para correr por largos períodos de tiempo: contexto, personas, contexto.

Por último, la columna vertebral de OLTP en Google y Ebay se ejecuta en Java. Lo tomaría como prueba por contradicción de que Java no es lento (al menos para condiciones que importan, no para pequeños experimentos con juguetes, puntos de referencia y evidencia anecdótica no verificable hecha específicamente con el propósito de decir "el X es lento, apesta".

Hay ingeniería, y hay fanboyismo. ¿Adivina a qué categoría pertenecen las declaraciones como esas?

8
luis.espinal

Porque es así, ¿podemos cerrar este tema de una vez y para siempre?

https://days2011.scala-lang.org/sites/days2011/files/ws3-1-Hundt.pdf [desplácese hacia abajo a las tablas, Java es 3.7 -12.6 veces más lento que C++, investigación realizada por empleados de Google]

P.S .: si no es así, llámame al menos una aplicación rápida Java para empezar, no he visto una antes.

8
Coder

¿Lento en comparación con qué? Estoy pensando en cambiar de ordinario Ruby a JRuby (Ruby basado en Java) porque he oído que es más rápido.

6
Andrew Grimm

Las opiniones son opiniones, y los hechos son hechos.

Aquí hay un hecho de Google Code Jam, que posiblemente desafía a los programadores a resolver problemas informáticos difíciles en un corto período de tiempo, lo que significa que el rendimiento del lenguaje que utilizan juega un papel importante:

Durante las últimas ediciones (2009, 2010, 2011), alrededor del 75% de los programadores que llegaron a las rondas finales usaban C++, en comparación con alrededor del 15% que usaban Java.

Fuente -> http://www.go-hero.net/jam/

6
Daniel Scocco

TMHO, esto se debe al tiempo necesario para iniciar el VM en el navegador. Si una aplicación se inicia lentamente, la gente solo recordará eso. Porque, el largo tiempo de inicio es realmente molesto. Realmente. Uno de mi compañero de trabajo me dijo que no usa Firefox porque es demasiado lento. (?!?). Pero, sí, está bien, en Windows, Firefox tarda mucho tiempo en aparecer. Según él, esta aplicación es lenta, se decidió por la velocidad general de la misma.

6
Pierre Watelet

Alrededor de 1997 usé un HP Vectra VE (200 MHz) y Windows 95. La mayoría de las aplicaciones se ejecutaron muy rápido en esto, pero luego probé algunas aplicaciones escritas en Java (IDEs, si recuerdo correctamente) Fueron muy lentos, al menos las partes de la GUI. Tomaron mucho tiempo para comenzar, y los elementos de la GUI (por ejemplo, los menús) no respondieron muy bien, hubo retrasos en la retroalimentación visual. También, ya que Java GUI tenían (tiene) un aspecto bastante distintivo, aprendí a asociar este aspecto (y Java) con un bajo rendimiento.

4
Andreas Rejbrand

Depende de lo que quieras decir como lento.

En primer lugar, Java ya que progresó mucho recientemente y es muy rápido en la mayoría de los casos. Pero:

  • Java es lento al inicio, porque debe cargar la JVM antes de hacer nada.
  • Algunas características de seguridad pueden matar las actuaciones en algunos casos. La verificación encuadernada con acceso aleatorio es un ejemplo.
  • Haga algo realmente rápido en Java requiere trabajar contra la JVM (para aprovechar la línea de caché por ejemplo).
  • La falta de metaprogramación implica una penalidad en el tiempo de ejecución con cada abstracción, por lo que el rendimiento conlleva el costo del diseño en muchos casos.
  • Java difícilmente puede garantizar la restricción de tiempo real, por diseño, y esto podría ser considerado como "lento" por algunas personas.

Por cierto, Java es, en algunos casos, más rápido que Vanilla C/C++. Pero estos lenguajes te dan las herramientas para ajustarlos.

Java es un lenguaje de programación dirigido a la productividad. Ahora es lo suficientemente rápido para la mayoría de las aplicaciones, pero no lo es para otras.

En general, la lentitud de Java es un argumento sobreutilizado porque es irreverente en la mayoría de los casos.

4
deadalnix

Simple, canónico Java tiende a estar a la par o más rápido que el simple código canónico C/C++/D. El código simple y canónico tiende a realizar muchas asignaciones de memoria innecesariamente, no es particularmente sintonizado a cualquier arquitectura de CPU, no tiene toneladas de optimizaciones de bajo nivel, etc. El HotSpot GC de Java es nada menos que sorprendente, y las optimizaciones VM tienden a ser mejores que un compilador estático) podría hacer.

Por otro lado, si realmente necesita rendimiento y está dispuesto a ajustar manualmente las cosas para obtenerlo, C/C++/D ofrece muchas más oportunidades para esto. No puede usar el ensamblador en línea en Java. No puedes usar trucos de punteo de tipo sucio para tratar los números de coma flotante como conjuntos de bits. No puede usar esquemas de administración de memoria personalizados que pueden ser más rápidos que el GC para su caso de uso específico. No puede asignar casi tanto en la pila en Java como en C/C++/D. En Java la única forma de obtener algo más o menos equivalente a las funciones de orden superior son con interfaces y enlace de tiempo de ejecución.En D y (creo que me corrigen si estoy equivocado) C++, puede pasar funciones a las plantillas, lo que permite que el enlace ocurra en tiempo de compilación sin pérdida de flexibilidad.

2
dsimcha

Otro punto para la "lentitud" de Java es el tiempo de ejecución de 64 bits.

He escuchado a algunas personas quejarse de que Java es muy lento para ellos en computadoras de 64 bits. Como resultado, 64bit Java runtime usa el servidor JVM que compila el programa completo antes de comenzar.

AQUÍ es la explicación de por qué 64bit VM comienza más lento.

Por ejemplo en Windows:

C:\> Java -version  
Java version "1.6.0_21"  
Java(TM) SE Runtime Environment (build 1.6.0_21-b06)  
Java HotSpot(TM) 64-Bit Server VM (build 17.0-b16, mixed mode)  
1
AndrejaKo

Para tirar una moneda sin valor, encuentro que Java webapps generalmente tienen tiempos de inicio y respuesta largos, donde me parece que Python o Ruby hubiera sido mejor.

Utilizo Eclipse para la mayor parte de mi programación, y debo decir que Java es tan rápido como cualquier otra cosa, si no más rápido ejecutándose localmente y "independiente".

0
thomas

El rendimiento de Java es muy subjetivo, sin embargo, la percepción de por qué Java es lenta es en gran parte por razones que otros han notado: la percepción de la gente de algo es de color por su experiencia anterior con él y Java no siempre ha sido un lenguaje bien optimizado bajo el capó. Del mismo modo, Vanilla Eclipse no es exactamente un rápido IDE para trabajar y palidece en términos de capacidad de respuesta en comparación con un IDE como Visual Studio.

Sin embargo, dicho esto, fuera de los problemas de UI que Java tiene al inicio, es lo suficientemente rápido para la mayoría de las aplicaciones. Si busca puede encontrar artículos que lo comparan con otros idiomas y la mayoría de los resultados presentados lo colocan en el rango donde solo será un problema cuando se trata de conjuntos de datos importantes.

En el campo de la bioinformática se usa bastante porque está bien soportado y ya hay una base de instalación para, una de las ventajas que Java tiene es que puede hacer un desarrollo bastante rápido con no se puede hacer con C. Si observa los lenguajes utilizados para la bioinformática (personalmente uso R, Python y Java regularmente), notará que ninguno de ellos es exactamente el más rápido y no es inusual que los conjuntos de datos en bioinformática se encuentren con cientos de gigabytes de información. Al final del día, el tiempo humano es aún más valioso y aunque las diferencias de velocidad son notables, el tamaño de los conjuntos de datos tienden a ser lo suficientemente grandes como para correr de la noche a la mañana de todos modos.

Si fuera más fácil escribir una interfaz de usuario rápida en Java, es muy probable que la percepción de la velocidad se salga del radar ya que la mayoría de las personas no empujan los idiomas lo suficiente como para que la velocidad sea realmente un problema diario base.

0
rjzii