2009-06-18 23 views
189

Estamos empezando a hacer un uso más intenso de GWT en nuestros proyectos, y el rendimiento del compilador de GWT es cada vez más molesto.¿Cómo agito el compilador gwt?

Vamos a comenzar a modificar nuestras prácticas de trabajo para mitigar el problema, incluyendo un mayor énfasis en el navegador de modo alojado, que difiere la necesidad de ejecutar el compilador GWT hasta más adelante, pero eso conlleva sus propios riesgos , especialmente el de no detectar problemas con los navegadores reales hasta mucho más tarde de lo que nos gustaría.

Idealmente, nos gustaría hacer el compilador de GWT más rápido, un minuto para compilar una aplicación bastante pequeña es tomar el pelo. Sin embargo, estamos utilizando la compilación de una manera bastante ingenua, por lo que espero que podamos hacer algunas ganancias rápidas y fáciles.

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

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

Sé que podemos decir que solo compila para un navegador, pero tenemos que hacer pruebas de múltiples navegadores, por lo que no es realmente práctico.

Todas las sugerencias son bienvenidas en este punto.

Respuesta

137

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

Un buen rendimiento truco que puede hacer es compilar para navegadores solamente específicas, 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 2.x GWT, y por sólo un navegador:

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

Esto, por ejemplo, compilará su aplicación solo para IE y FF. Si sabes que estás usando solo un navegador específico para probar, puedes usar este pequeño truco.

Otra opción: si está utilizando varias configuraciones regionales y vuelve a usar solo una para probar, puede comentarlas todas para que GWT use la configuración regional predeterminada, lo que reduce algunos gastos adicionales desde el tiempo de compilación.

Conclusión: no obtendrás un aumento del orden de magnitud en el rendimiento del compilador, pero tomando varias relajaciones, puedes depilarte unos minutos aquí y allá.

+3

Aparece por GWT 2.0, en realidad se quieren esta sintaxis para especificar un agente de usuario: \t mooreds

+0

En GWT 2.2 no hay gecko . El compilador declara que "El valor gecko no se definió previamente. Excepción inesperada al procesar el elemento 'set-property'" – uthark

+0

configurando el valor a "gecko1_8" solo debería funcionar para Firefox 1.5 y posterior en gwt 2.2 – eaykin

14

El compilador GWT está haciendo un montón de análisis de código por lo que será difícil acelerarlo. This session from Google IO 2008 le dará una buena idea de lo que GWT está haciendo y por qué tarda tanto tiempo.

Mi recomendación es para el desarrollo, use el modo hospedado tanto como sea posible y luego solo compile cuando quiera hacer su prueba. Esto suena como la solución que ya has encontrado, pero básicamente es por eso que el Modo Hosted está ahí (bueno, eso y la depuración).

Puede acelerar la compilación GWT pero solo compilando para algunos navegadores, en lugar de 5 tipos que GWT realiza de forma 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 Hosted ya no funciona.

Una manera fácil de configurar la compilación de un menor número de navegadores es la creación de un segundo módulo que hereda 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 atributo rename-to se establece la misma, entonces los archivos de salida será el mismo que si Hizo una compilación completa

10
  • Divida su aplicación en varios módulos o puntos de entrada y vuelva a compilar solo cuando sea necesario.
  • Analice su aplicación utilizando la versión troncal, que proporciona el Story of your compile. Esto puede o no ser relevante para el compilador 1.6 pero puede indicar lo que está sucediendo.
+0

Que las cosas de SOYC se ven bien, gracias por la sugerencia. – skaffman

+0

Los puntos de entrada múltiples deberían funcionar, pero no los 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 material del marco GWT. – user1050755

58

Si ejecuta el compilador GWT con el indicador -localWorkers, el compilador compilará permutaciones múltiples en paralelo. Esto le permite usar todos los núcleos de una máquina multi-core, por ejemplo -localWorkers 2 le dirá 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 permutaciones múltiples.

Si está dispuesto a usar la versión troncal de GWT, podrá usar el modo alojado para cualquier navegador (out of process hosted mode), lo que alivia la mayoría de los problemas actuales con el modo alojado. Parece que es a donde va el GWT: siempre desarrolle con el modo alojado, ya que las compilaciones probablemente no obtendrán magnitudes más rápidas.

+2

Ah, la opción de trabajo local es una joya, vale la pena conocerla. Tristemente, la mayoría de nuestras cajas de desarrollo son xeones de un solo núcleo. Esa OOPHM parece muy prometedora también. Siempre en la próxima versión, es ... – skaffman

+4

virtualizar un entorno de compilación en un cuadro con varios núcleos; remoto en este vm; ejecutar la línea de comando GWT compilar usando -localWorkers, con locales mínimos y user.agents; asegúrese de que el cuadro que aloja el vm es un igual de red al lugar donde se está implementando. La combinación de esto hace que su compilación baje a unos 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 usando algún tipo de intercambio de NFS o samba, eliminando la necesidad de copiar solo las diferencias de src. ¡Hurra! –

+0

El cliente NX también es un gran +++ para el desarrollo remoto en conexiones ADSL, de cable o WiFi limitadas. Además, siempre está sincronizado, independientemente de la compilación que esté utilizando en cualquier ubicación w/internet –

51

Aunque esta entrada es bastante antigua y la mayoría de ustedes probablemente ya lo sepa, creo que vale la pena mencionar que GWT 2.x incluye una nueva bandera de compilación que acelera las compilaciones omitiendo las optimizaciones. Definitivamente no deberías 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 en su línea de compilación de GWT.

+3

Utilicé esa opción, y en nuestro proyecto algunas veces falló con un error extraño.Así que ten en cuenta que a veces la compilación puede no funcionar debido a esto. – Vic

4

Para GWT 2.x acabo de descubrir que si utiliza

<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.

29

Here is a list of user.agent values puede configurarlo.

(añadiendo esto 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"/>)

+0

¿Dónde se supone que debo agregar este elemento set-property? Intenté agregarlo dentro y fuera del elemento en mi archivo app.gwt.xml y no funciona. –

+0

Va en su archivo ABC.gwt.xml donde ABC es el nombre de su módulo. – Glenn

30

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

<collapse-all-properties /> 

a su gwt.xml para fines de desarrollo. Eso le dirá al compilador de GWT que cree una sola permutación que cubra todas las configuraciones regionales y navegadores.Por lo tanto, todavía se puede probar en todos los navegadores y lenguajes, pero todavía está solamente la compilación de una sola permutación

+2

Interesante ... ¿cuál es el inconveniente? – skaffman

+0

compilar una única permutación que maneja todos los navegadores e idiomas aún toma un poco más de tiempo que una sola permutación que maneja solo un navegador y lenguaje, pero la diferencia no es significativa en mi experiencia. (~ 25% más es lo que estoy viendo, pero eso todavía es una gran mejora sobre la compilación de permutaciones múltiples) – Chi

+0

No encuentro un enlace de doc para esto ... ¿se puede vincular a algo? – skaffman

13

Usted puede agregar una opción para su construcción para la producción:

-localWorkers 8- Donde 8 es el número de subprocesos concurrentes que calculan las permutaciones. Todo lo que tiene que hacer es ajustar este número al número que le resulte más conveniente. Ver GWT compilation performance (gracias al comentario de Dennis Ich).

Si está compilando el entorno de prueba, también se puede utilizar:

-draftCompile que permite más rápido, pero compilaciones menos optimizadas para

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

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 como un amuleto). 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!

+0

Establecer trabajadores locales para la cantidad de núcleos puede ser muy improductivo. Ver esto como referencia: http://josephmarques.wordpress.com/2010/07/30/gwt-compilation-performance/ –

+0

Gracias por tu comentario Dennis. En realidad, tengo una 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 deja 2 núcleos gratis. Eso es solo un ejemplo. Sin embargo, editaré mi publicación para incluir tu idea. Gracias. –