¿Cómo acelerar el compilador gwt?

201

Estamos comenzando a hacer un uso más intensivo de GWT en nuestros proyectos, y el rendimiento del compilador de GWT es cada vez más molesto.

Vamos a comenzar a alterar nuestras prácticas de trabajo para mitigar el problema, incluido un mayor énfasis en el navegador en modo alojado, lo que aplaza la necesidad de ejecutar el compilador GWT hasta un momento posterior, pero eso conlleva sus propios riesgos, particularmente el de no detectar problemas con navegadores reales hasta mucho más tarde de lo que quisiéramos.

Idealmente, nos gustaría hacer que el compilador de GWT sea más rápido: un minuto para compilar una aplicación bastante pequeña está tomando el pelo. Sin embargo, estamos usando la compilación de una manera bastante ingenua, así que espero que podamos obtener ganancias rápidas y fáciles.

Actualmente estamos invocando com.google.gwt.dev.Compiler como una aplicación java del objetivo Ant Ant, con un montón máximo de 256m y mucho espacio de pila. Ant compila el compilador utilizando fork = true y el último Java 6 JRE, para intentar aprovechar el rendimiento mejorado de Java6. Pasamos nuestra clase de controlador principal al compilador junto con el classpath de la aplicación, y listo.

¿Qué más podemos hacer para obtener más velocidad? ¿Podemos darle más información para que pase menos tiempo descubriendo qué hacer?

Sé que podemos decirle que solo compile para un navegador, pero necesitamos hacer pruebas en varios navegadores, así que eso no es realmente práctico.

Todas las sugerencias son bienvenidas en este momento.

skaffman
fuente

Respuestas:

144

Comencemos con la incómoda verdad: el rendimiento del compilador GWT es realmente pésimo. Puede usar algunos hacks aquí y allá, pero no obtendrá un rendimiento significativamente mejor.

Un buen truco de rendimiento que puede hacer es compilar solo para navegadores específicos, insertando la siguiente línea en su gwt.xml:

<define-property name="user.agent" values="ie6,gecko,gecko1_8"></define-property>

o en la sintaxis de gwt 2.x, y solo para un navegador:

<set-property name="user.agent" value="gecko1_8"/>

Esto, por ejemplo, compilará su aplicación solo para IE y FF. Si sabe que está usando solo un navegador específico para las pruebas, puede usar este pequeño truco.

Otra opción: si está utilizando varias configuraciones regionales, y nuevamente está usando solo una para las pruebas, puede comentarlas todas para que GWT use la configuración regional predeterminada, esto ahorra una sobrecarga adicional del tiempo de compilación.

En pocas palabras: no va a obtener un aumento de orden de magnitud en el rendimiento del compilador, pero tomando varias relajaciones, puede ahorrar unos minutos aquí y allá.

Yuval Adam
fuente
3
Parece que para GWT 2.0, realmente desea que esta sintaxis especifique un agente de usuario: <set-property name = "user.agent" value = "gecko, gecko1_8" />
amarrado
En gwt 2.2 no hay gecko. Compilador establece que "El valor gecko no se definió previamente una excepción inesperada durante el procesamiento de elemento de 'set-propiedad'."
uthark
establecer el valor en "gecko1_8" solo debería funcionar para Firefox 1.5 y posterior en gwt 2.2
eaykin
Esta respuesta tiene casi dos años. Siéntase libre de editarlo para aclarar este punto.
Yuval Adam
66
2013, todavía el tiempo de compilación de GWT apesta, ¿alguien puede mejorar esta respuesta? GWT 2.5
Forhad
62

Si ejecuta el compilador GWT con el indicador -localWorkers, el compilador compilará múltiples permutaciones en paralelo. Esto le permite utilizar todos los núcleos de una máquina multinúcleo, por ejemplo -localWorkers 2 le indicará al compilador que compile dos permutaciones en paralelo. No obtendrá diferencias de orden de magnitudes (no todo en el compilador es paralelizable) pero sigue siendo una aceleración notable si está compilando múltiples permutaciones.

Si está dispuesto a usar la versión troncal de GWT, podrá usar el modo alojado para cualquier navegador ( modo alojado fuera del proceso ), lo que alivia la mayoría de los problemas actuales con el modo alojado. Parece que es a donde va el GWT: siempre se desarrolla con el modo alojado, ya que no es probable que las compilaciones obtengan magnitudes más rápido.

Chi
fuente
2
Ah, la opción localWorkers es una joya que vale la pena conocer. Lamentablemente, la mayoría de nuestras cajas de desarrollo son xeones de un solo núcleo. Esa OOPHM también parece muy prometedora. Siempre en la próxima versión, es ...
skaffman
44
virtualizar un entorno de compilación en una caja con múltiples núcleos; remoto en este vm; ejecute la compilación GWT de línea de comandos usando -localWorkers, con mínimos locales y user.agents; asegúrese de que la caja que aloja el vm sea un par de red en el que se está implementando. La combinación de esto hace que su compilación se reduzca a aproximadamente 30 segundos con implementación en tomcat. Además, todo esto se puede escribir en un guión. También puede desarrollar en una máquina local, crear un parche svn y hacer que su script aplique el parche utilizando algún tipo de NFS o uso compartido de samba, eliminando la necesidad de copiar solo los diferenciales src. ¡Hurra!
kr.
El cliente NX también es un gran +++ para desarrolladores remotos en conexiones ADSL, cable o WiFi limitadas. Además, siempre está sincronizado, independientemente de la composición que esté utilizando en cualquier ubicación con internet
kr.
el valor predeterminado es el número de CPU disponibles en la plataforma en la compilación maven. Así que no hay velocidad aquí para mí.
keiki
55

Aunque esta entrada es bastante antigua y la mayoría de ustedes probablemente ya lo sepan, creo que vale la pena mencionar que GWT 2.x incluye un nuevo indicador de compilación que acelera las compilaciones omitiendo las optimizaciones. Definitivamente no debe implementar JavaScript compilado de esa manera, pero puede ahorrar tiempo durante las compilaciones continuas que no son de producción.

Solo incluya la bandera: -draftCompile a su línea de compilador GWT.

monzonj
fuente
3
Usé esa opción, y en nuestro proyecto a veces fallaba con un error extraño. Tenga en cuenta que a veces la compilación podría no funcionar debido a esto.
Vic
31

Aquí hay una lista de valores de user.agent en los que puede establecerlo.

(La adición de este aquí porque sigo terminando aquí cuando la búsqueda de lo que debería establecer para que sea sólo producen una permutación de cromo respuesta es:. <set-property name="user.agent" value="safari"/>)

Stephen
fuente
¿Dónde se supone que debo agregar este elemento set-property? Intenté agregarlo dentro y fuera del elemento <module> en mi archivo app.gwt.xml y no funciona.
Alex Worden
Va en el archivo ABC.gwt.xml de su módulo donde ABC es el nombre de su módulo.
Glenn
30

En las versiones más recientes de GWT (a partir de 2.3 o 2.4, creo), también puede agregar

<collapse-all-properties />

a su gwt.xml para fines de desarrollo. Eso le indicará al compilador GWT que cree una única permutación que cubra todos los entornos locales y navegadores. Por lo tanto, aún puede realizar pruebas en todos los navegadores e idiomas, pero todavía solo compila una sola permutación

Chi
fuente
2
Interesante ... ¿cuál es el inconveniente?
skaffman
compilar una sola permutación que maneja todos los navegadores e idiomas todavía lleva un poco más de tiempo que una permutación que maneja solo un navegador e idioma, pero la diferencia no es significativa en mi experiencia. (~ 25% más es lo que estoy viendo, pero eso sigue siendo una gran mejora sobre la compilación de permutaciones múltiples)
Chi
No puedo encontrar un enlace de documento para esto ... ¿puedes vincular a algo?
skaffman
Aunque esta etiqueta acelera la compilación, también interrumpe la depuración en modo Super Dev (al menos para 2.6). El código fuente que se muestra en el depurador de Chrome difiere del código js compilado. Entonces, cuando pongo un punto de interrupción en algún método de Java, el depurador se detiene en otro método.
Damluar
18

Puede agregar una opción a su compilación para producción:

-localWorkers 8- Donde 8 es el número de hilos concurrentes que calculan permutaciones. Todo lo que tiene que hacer es ajustar este número al número que sea más conveniente para usted. Vea el rendimiento de la compilación GWT (gracias al comentario de Dennis Ich).

Si está compilando para el entorno de prueba, también puede usar:

-draftCompile que permite compilaciones más rápidas pero menos optimizadas

-optimize 0 que no optimiza su código (9 es el valor máximo de optimización)

Otra cosa que más que duplicó el rendimiento de la compilación y el modo alojado fue el uso de un disco SSD (ahora el modo alojado funciona de maravilla). No es una solución barata, pero dependiendo de cuánto use GWT y el costo de su tiempo, ¡puede valer la pena!

¡Espero que esto te ayude!

martins.tuga
fuente
Establecer trabajadores locales en el número de núcleos puede ser muy improductivo. Vea esto como referencia: josephmarques.wordpress.com/2010/07/30/…
Dennis Ich
Gracias por comentar Dennis. En realidad, tengo un SSD y doy 2G de memoria. Por supuesto, el número de LocalWorker debe ajustarse a cada caso, dependiendo del número de permutaciones, núcleos, máquina, etc. En mi caso, cuando estoy compilando en mi computadora portátil y quiero navegar en la web, si Deje 2 núcleos gratis. Eso es solo un ejemplo. Sin embargo, editaré mi publicación para incluir su idea. Gracias.
martins.tuga
14

El compilador de GWT está haciendo mucho análisis de código, por lo que será difícil acelerarlo. Esta sesión de Google IO 2008 le dará una buena idea de lo que está haciendo GWT y por qué lleva tanto tiempo.

Mi recomendación es que el desarrollo use el Modo Hospedado tanto como sea posible y luego solo compile cuando quiera hacer sus pruebas. Esto suena como la solución a la que ya has llegado, pero básicamente es por eso que el Modo Hospedado está ahí (bueno, eso y depuración).

Puede acelerar la compilación de GWT, pero solo compila para algunos navegadores, en lugar de los 5 tipos que GWT hace de manera predeterminada. Si desea utilizar el Modo hospedado, asegúrese de compilar para al menos dos navegadores; si compila para un solo navegador, el código de detección del navegador se optimiza y el modo hospedado ya no funciona.

Una manera fácil de configurar la compilación para menos navegadores es crear un segundo módulo que herede de su módulo principal:

<module rename-to="myproject">
  <inherits name="com.mycompany.MyProject"/>
  <!-- Compile for IE and Chrome -->
  <!-- If you compile for only one browser, the browser detection javascript
       is optimised away and then Hosted Mode doesn't work -->
  <set-property name="user.agent" value="ie6,safari"/>
</module>

Si el rename-toatributo se establece igual, los archivos de salida serán los mismos que si hiciera una compilación completa

Dave Webb
fuente
11
  • Divida su aplicación en múltiples módulos o puntos de entrada y vuelva a compilarla solo cuando sea necesario.
  • Analice su aplicación utilizando la versión troncal, que proporciona la historia de su compilación . Esto puede o no ser relevante para el compilador 1.6, pero puede indicar lo que está sucediendo.
Robert Munteanu
fuente
Múltiples puntos de entrada deberían funcionar, pero no módulos porque GWT siempre verifica todo lo conectado a su código y compila un resultado final monolítico. El marco GWT es un desastre y una desgracia para los principios de modularidad. No encontré un buen proyecto que reutilizara el marco de trabajo de GWT.
user1050755
4

Para GWT 2.x acabo de descubrir que si usas

<set-property name="user.agent" value="ie6"/>
<extend-property values="ie8,gecko1_8" name="user.agent"/>

Incluso puede especificar más de una permutación.

CCarpo
fuente