java performance editor

¿Por qué los editores basados en Java suelen ser lentos, dado que se dice que Java es rápido después de una fase de calentamiento?



performance (4)

Quizás Java utiliza más memoria normalmente (al menos, según mi experiencia, y los alioth benchmarks parecen estar de acuerdo ...

Tenga cuidado de no confundir las diferencias en la asignación de memoria predeterminada con las diferencias en la memoria utilizada cuando la tarea requiere que los programas asignen más que la memoria predeterminada.

regex-dna, complemento inverso, árboles binarios, k-nucleótido, mandelbrot requieren asignación de memoria.

También tenga en cuenta que algunos de los programas están escritos para multinúcleo y asignan búferes adicionales para acumular resultados de varios subprocesos.

Ok, sé que la mayoría de la gente dice que "java no es lento en estos días, solo tiene una fase de inicio lenta" pero nadie puede mirarme a los ojos y decirme que usar netbeans o eclipse o jedit es tan receptivo como, por ejemplo, visual estudio o compañero de texto, incluso después de correr durante horas de "calentamiento". Oh, el tiempo de inicio es definitivamente un problema (eclipse de tos) Lo admito, pero estoy hablando de una respuesta general aquí. Jedit tiene un pequeño retraso notable cuando redimensionas las ventanas, por ejemplo.

Creo que una comparación razonable entre manzanas y manzanas sería jedit (o cualquier editor de texto basado en java) versus TextMate, SciTE.

La pregunta a la que realmente se reduce es "si netbeans / eclipse se reescribiera completamente en C, con el mismo conjunto de características, se esperaría que tuviera las mismas características de rendimiento que tiene actualmente".

¿Algunas ideas?

Y algunas observaciones:

Este simple editor basado en swing [1] tiene retrasos muy raros cuando cambia el tamaño de la ventana, pero el desplazamiento se siente bastante sensible. Además, con netbeans, cuando comienzas a cambiar el tamaño, hasta que "dejas de" cambiar el tamaño de la ventana, dibuja un fondo negro feo [4]. ¿Quizás swing se niega a realizar actualizaciones mientras se arrastra la ventana?

Aquí hay un simple editor de texto simple swt [2]. Es bastante sensible tanto al arrastre como al desplazamiento.

Aquí hay otro editor simple (jface) swt [3]. Se redimensiona tan mal que creo que debe ser una mala casualidad. Espero.

También he notado que el bloc de notas y el estudio visual tienden a mostrar "blips" blancos temporales cuando se actualizan (por ejemplo, cuando se usa la página abajo en un documento muy largo). Parece que las aplicaciones swt y swing nunca tienen esos blips blancos adicionales, así que me pregunto si tienen algún búfer interno adicional o algo así. Esto podría causar una pequeña desaceleración, la percepción sabia

[5] es una pregunta relacionada, pero no exactamente la misma.

Mis conjeturas actuales, basadas un poco en las respuestas / comentarios existentes:

  • Netbeans acaba de hincharse. ¿Tal vez haya algo en la edición de java que haga que los creadores de editores se esfumen? ¿Quizás no optimicen a sus editores por alguna razón?
  • Los editores de Java usan toneladas de RAM, ¿quizás eso mantiene las cosas fuera del caché L2?
  • Los editores de Java editan java, así que tal vez tienen que seguir llamando constantemente a, digamos, javac, que incurre en la penalización de inicio lenta una y otra vez cada vez.
  • SWT es una capa de abstracción sobre los widgets nativos, lo que puede ralentizar las cosas.
  • Swing tiene una terrible política de actualización de tamaño, lo que hace que "parezca" lento.
  • Netbeans usa la máquina virtual del cliente, ¿entonces tal vez simplemente no está sintonizado para la velocidad? (vea también [6] que contiene un enlace a otra pregunta con una respuesta que es una serie de parámetros que puede pasar a netbeans para intentar acelerarlo).
  • Swing / SWT parece tener menos artefactos durante el desplazamiento que las aplicaciones nativas de Windows. Tal vez esto significa que tienen "ayudantes" de almacenamiento en búfer para ayudar a evitar artefactos, lo que causa una percepción de lentitud ya que no se actualiza de inmediato.
  • Tal vez Java no tiene puntos de referencia megalíticos, así que tal vez no esté optimizado para ese tipo de cargas. Tal vez hay algunas ineficiencias ocultas.
  • De manera relacionada, tal vez Java se pueda "hacer que sea" rápido, pero de alguna manera los creadores del editor no lo están utilizando de manera eficiente ("la biblioteca principal me ahorrará velocidad").
  • Tal vez simplemente se "siente" lento, ya que (al menos netbeans) tiene que recurrir constantemente a nuevas instancias de Java para ejecutar los depuradores, etc., cada uno de los cuales tiene su propio golpe de inicio lento.

¡Gracias! -roger-

[1] http://www.picksourcecode.com/articles/explan.php?id=6c9882bbac1c7093bd25041881277658&ems=9a0fa83125d48ab7258eab27754dd23e&lg=10

[2] https://gist.github.com/972234

[3] http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/BasicEditor.htm compile / ejecute como java -cp.; Swt / win32.jar; jface / * BasicEditor

[4] http://twitpic.com/4xi8ov

[5] ¿Es Java realmente lento?

[6] hay una manera de hacer que los netbeans utilicen el hotspot server vm


Esto no responde directamente a su pregunta, pero aquí hay más información sobre los puntos de referencia del kit de herramientas de la ventana.

Es difícil dar una regla de oro donde SWT superaría a Swing, o viceversa. En algunos entornos (por ejemplo, Windows), SWT es un ganador. En otros (Linux, VMware que aloja a Windows), Swing y su optimización de redibujado superan significativamente a SWT. Las diferencias en el rendimiento son significativas: los factores de 2 y más son comunes, en cualquier dirección. El código escrito en C / C ++ con la biblioteca X se realiza algo más rápido que el código escrito en Java con SWT, con una aceleración del 5% al ​​10%

Fuente http://pub.cosylab.com/CSS/DOC-SWT_Vs._Swing_Performance_Comparison.pdf


Para hacer todo ese chequeo y resaltado de sintaxis del código "sobre la marcha", básicamente debe escribir su editor para comprender (es decir, lex, parse, verificación de tipo, verificación de sintaxis, etc.) el lenguaje java y el contenido del texto. editor durante cada estado intermedio entre usted, comenzando con una clase casi vacía y terminando su programa.

También para la integridad de la referencia cruzada, debe tener suficiente información sobre todas las otras clases en la memoria, de modo que realmente pueda asegurarse de que cuando llama a un método en un objeto, realmente existe en ese "otro" objeto.

Eso sin mencionar todos los otros lugares donde se indexan los elementos, etc.

En resumen, es lento porque está haciendo mucho, incluso si todas las cosas que está haciendo no son inmediatamente apreciadas por una persona que solo está preocupada por las letras en la pantalla (y no por todas las características del IDE).


Quizás estés confundiendo 2 cosas diferentes:

  • "Java no es lento en estos días, solo tiene una fase de inicio lenta"

JVM funciona como un intérprete de código de bytes hasta que se identifican los métodos activos, y solo luego los compila en un código nativo.

Para la configuración de -server VM (que puede ser la predeterminada en su hardware), los métodos no se compilan hasta que el número de invocaciones / sucursales de métodos sea> XX: CompileThreshold = 10000

  • Incluso después de correr durante horas de "calentamiento". Oh, el tiempo de inicio es definitivamente un problema (eclipse de tos)

Incluso después de correr, digamos Eclipse, por horas, ¿crees que has usado el mismo método 10,000 veces? (Intente iniciar su editor de Java utilizando el indicador JVM -client ).

Eclipse es un IDE grande. Realmente no es un editor de texto básico. ¿Tal vez solo está tratando de lograr mucho más cuando se inicia que lo que un editor de texto básico está tratando de hacer?