Cómo acelerar el tiempo de compilación MonoTouch?


Es bien conocido que

Si la compilación toma incluso 15 segundos, los programadores se aburrirán mientras el compilador se ejecuta y cambiarán a leer La Cebolla, lo que los absorberá y matará horas de productividad.

Nuestra aplicación MonoTouch tarda 40 segundos en compilar en Macbook Air en la configuración de depuración/Simulador.

Tenemos alrededor de 10 conjuntos en la solución.
También estamos enlazando contra algunas bibliotecas nativas con gcc_flags.

Estoy seguro de que hay formas de optimizar el tiempo de compilación que no conozco, que podrían tener que ver con referencias, enlazador, lo que sea.

Estoy haciendo esta pregunta con la esperanza de que alguien con mejor conocimiento que yo compilará (sin juego de palabras) una lista de consejos y cosas para verificar para reducir el tiempo de compilación MonoTouch para compilaciones de depuración.

Please don't suggest hardware optimizations or optimizations not directly related to MonoTouch.

Author: Dan Abramov, 2012-12-20

3 answers

Mejoras en el tiempo de compilación en Xamarin.iOS 6.4

Xamarin.iOS 6.4 tiene mejoras significativas en el tiempo de compilación, y ahora hay una opción para enviar solo bits de código actualizados al dispositivo. Compruébelo usted mismo:

Mejoras en el tiempo de construcción

Lea más y aprenda cómo habilitar la compilación incremental en El post de Rolf.

Evolve 2013 Video

Una versión actualizada y ampliada de este contenido se puede ver en el video de la Avanzado Mecánica de construcción de iOS charla que di en Evolve 2013 .

Respuesta original

Hay varios factores que afectan la velocidad de construcción. Sin embargo, la mayoría de ellos tienen más impacto en las compilaciones de dispositivos, incluido el uso del enlazador administrado que mencionaste.

Enlazador gestionado

Para dispositivosentonces Link alles el más rápido, seguido de Link SDKy (al final) Don't link. La razón es que el enlazador puede eliminar código más rápido de lo que el compilador AOT puede construir (ganancia neta). También los más pequeños .la aplicación se cargará más rápido en sus dispositivos.

Para el simulador Don't link siempre es más rápido porque no hay AOT (se usa el JIT). No debe usar otras opciones de enlace a menos que desee probarlas (aún es más rápido que hacer una compilación de dispositivo).

Trucos de dispositivos

  • Construir una sola arquitectura (por ejemplo ARMv7) es más rápido que un binario FAT (por ejemplo. ARMv7 + ARMV7s). Las aplicaciones más pequeñas también significan menos tiempo para cargar en el dispositivo;

  • El compilador AOT (mono) predeterminado es mucho más rápido que usar compiladores LLVM. Sin embargo, el último generará mejor código y también soporta ARMv7s, Thumb2;

  • Si tiene grandes activos agrupados en su .aplicación a continuación, tomará tiempo para implementar / cargar (cada vez, ya que deben ser firmados) con su aplicación. Escribí una entrada de blog sobre cómo puede solucionar esto - puede ahorrar mucho tiempo si tiene grandes activos;

  • El almacenamiento en caché de archivos de objeto se implementó en MonoTouch 5.4. Algunas compilaciones serán mucho más rápidas, pero otras no (cuando la caché debe ser purgada) más rápidas (pero nunca más lentas ;-). Más información sobre por qué sucede esto a menudo aquí).

  • Las compilaciones de depuración toman más tiempo debido a los símbolos, correr dsymutil y, dado que termina siendo más grande, tiempo extra para cargar en los dispositivos.

  • Release builds will, de forma predeterminada (puede desactivarlo), haga una tira IL de los ensamblados. Eso solo toma un poco de tiempo, probablemente ganado cuando se implementa (más pequeño .app) al dispositivo.

Trucos de simulador

  • Como se dijo anteriormente, intente evitar el enlace, ya que tomará más tiempo y requerirá copiar ensamblados (en lugar de vincularlos simbólicamente);

  • El uso de bibliotecas nativas es más lento porque no podemos reutilizar el simlauncher principal compartido ejecutable en tales casos y necesidad de pedir a gcc para compilar uno para la aplicación (y eso es lento).

Finalmente cada vez que en el tiempo duda! y con eso quiero decir que puedes agregar --time --time a tu proyecto extra mtouch arguments para ver una marca de tiempo después de cada operación: -)

 44
Author: poupou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-08 14:38:55

Esto no es realmente una respuesta, sino un marcador de posición temporal hasta que haya uno mejor.
Encontré esta cita de Seb :

Mira las opciones de compilación de tu proyecto y asegúrate de que el " Enlazador comportamiento " está en el valor predeterminado "ensamblados de SDK de enlace".

Si muestra "No enlazar", entonces experimentarás muy construcción larga tiempo (gran parte en dsymutil).

Aunque no se si sigue siendo relevante, porque MonoDevelop muestra una señal de advertencia cuando elijo esta opción, y no parece afectar mucho el rendimiento.

 4
Author: Dan Abramov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-19 23:18:59

No puede esperar que su compilador sea rápido sin entender todo lo que debe hacer. Las aplicaciones más grandes naturalmente tardarán más tiempo. Diferentes lenguajes o diferentes compiladores del mismo lenguaje pueden hacer una gran diferencia en cuánto tiempo se tarda en compilar su código.

Tenemos un proyecto que tardará casi 2 minutos en compilarse. Su mejor solución es encontrar una manera de reducir el número de veces que compila su código.

En lugar de intentando arreglar 1 línea de código y reconstruyendo, una y otra vez. Reúne a un grupo de personas para discutir el problema. O cree una lista de 3 o 4 cosas en las que desea trabajar, complételas todas y luego pruebe.

Estas son solo algunas sugerencias y no funcionarán en todos los casos.

 3
Author: Jastill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-19 23:35:49