¿Por qué el tiempo de compilación Swift es tan lento?

Estoy usando Xcode 6 Beta 6.

Esto es algo que me ha estado molestando desde hace un tiempo, pero está llegando a un punto en el que ahora apenas se puede usar.

Mi proyecto está empezando a tener unbueno tamaño de 65 archivos Swift y algunos archivos Objective-C en puente (que realmente no son la causa del problema).

Parece que cualquier ligera modificación en cualquier archivo Swift (como agregar un espacio en blanco simple en una clase que apenas se usa en la aplicación) hará que se vuelvan a compilar todos los archivos Swift para el objetivo especificado.

Después de una investigación más profunda, descubrí que lo que toma casi el 100% del tiempo del compilador es elCompileSwift fase donde Xcode ejecuta elswiftc comando en todos los archivos Swift de su objetivo.

Investigué un poco más, y si solo mantengo al delegado de la aplicación con un controlador predeterminado, la compilación es muy rápida, pero a medida que agregaba más y más archivos de mi proyecto, el tiempo de compilación comenzaba a ser muy lento.

Ahora con solo 65 archivos de origen, se tarda unos 8/10 segundos en compilar cada vez. No muyrápido en absoluto.

No he visto ninguna publicación que hable sobre este tema, exceptoéste, pero era una versión anterior de Xcode 6. Así que me pregunto si soy el único en ese caso.

ACTUALIZAR

He comprobado algunos proyectos de Swift enGitHub me gustaAlamofire, Euler yCryptoSwift, pero ninguno de ellos tenía suficientes archivos Swift para comparar realmente. El único proyecto que encontré fue comenzar a tenerbueno el tamaño eraSwiftHN, y aunque solo tenía una docena de archivos de origen, pude verificar lo mismo, un espacio simple y todo el proyecto necesitaba una recompilación que comenzaba a tomar un poco de tiempo (2/3 segundos).

En comparación con el código Objective-C, donde tanto el analizador como la compilación son increíblemente rápidos, realmente parece que Swift nunca podrá manejar grandes proyectos, pero por favor dígame que estoy equivocado.

ACTUALIZAR con Xcode 6 Beta 7

Todavía no hay mejora alguna. Esto está empezando a ponerse ridículo. Con la falta de#import en Swift, realmente no veo cómo Apple podrá optimizar esto.

ACTUALIZACIÓN con Xcode 6.3 y Swift 1.2

Apple ha agregadoconstrucciones incrementales (y muchas otras optimizaciones del compilador). Tienes que migrar tu código a Swift 1.2 para ver esos beneficios, pero Apple agregó una herramienta en Xcode 6.3 para ayudarte a hacerlo:

SIN EMBARGO

No te alegres demasiado rápido como lo hice. El solucionador de gráficos que usan para hacer que la construcción sea incremental aún no está muy bien optimizado.

De hecho, en primer lugar, no analiza los cambios en la firma de la función, por lo que si agrega un espacio en el bloque de un método, se volverán a compilar todos los archivos dependiendo de esa clase.

En segundo lugar, parece crear el árbol en función de los archivos que se volvieron a compilar, incluso si un cambio no los afecta. Por ejemplo, si mueve estas tres clases a archivos diferentes

class FileA: NSObject {
    var foo:String?
}
class FileB: NSObject {
    var bar:FileA?
}
class FileC: NSObject {
    var baz:FileB?
}

Ahora si modificasFileA, el compilador obviamente marcaráFileA para ser recompilado También recompilaráFileB (eso estaría bien en función de los cambios enFileA),pero ademásFileC porqueFileB se recompila, y eso es bastante malo porqueFileC nunca usaFileA aquí.

Así que espero que mejoren ese solucionador de árbol de dependencias ... he abierto unRadar con este código de muestra

ACTUALIZACIÓN Con Xcode 7 beta 5 y Swift 2.0

Ayer Apple lanzó la versión beta 5 y dentro de las notas de la versión pudimos ver:

Swift Language & Compiler • Compilaciones incrementales: cambiar solo el cuerpo de una función ya no debería causar la reconstrucción de archivos dependientes. (15352929)

Lo he probado y debo decir que está funcionando realmente (¡realmente!) Ahora. Optimizaron enormemente las compilaciones incrementales en Swift.

Le recomiendo que cree unswift2.0 bifurque y mantenga su código actualizado usando XCode 7 beta 5. Le agradarán las mejoras del compilador (sin embargo, diría que el estado global de XCode 7 sigue siendo lento y con errores)

ACTUALIZAR con Xcode 8.2

Ha pasado un tiempo desde mi última actualización sobre este tema, así que aquí está.

Nuestra aplicación ahora tiene aproximadamente 20k líneas de código Swift casi exclusivamente, que es decente pero no sobresaliente. Sufrió una migración rápida 2 y rápida 3. Se tarda unos 5 / 6m en compilar en una Macbook pro de mediados de 2014 (Intel Core i7 de 2.5 GHz), lo cual está bien en una construcción limpia.

Sin embargo, la construcción incremental sigue siendo una broma a pesar de que Apple afirma que:

Xcode no reconstruirá un objetivo completo cuando solo se hayan producido pequeños cambios. (28892475)

Obviamente, creo que muchos de nosotros simplemente nos reímos después de revisar estas tonterías (agregar una propiedad privada (¡privada!) A cualquier archivo de mi proyecto recompilará todo ...)

Me gustaría señalarles a ustedeseste hilo en los foros de desarrolladores de Apple, que tiene más información sobre el tema (así como también agradeció la comunicación del desarrollador de Apple sobre el tema de vez en cuando)

Básicamente, las personas han ideado algunas cosas para tratar de mejorar la compilación incremental:

Agrega unHEADER_MAP_USES_VFS configuración del proyecto establecida entrueInhabilitarFind implicit dependencies de tu esquemaCree un nuevo proyecto y mueva su jerarquía de archivos al nuevo.

Intentaré la solución 3 pero la solución 1/2 no funcionó para nosotros.

Lo que es irónicamente gracioso en toda esta situación es que al mirar la primera publicación sobre este tema, estábamos usando Xcode 6 con el código Swift 1 o Swift 1.1 cuando alcanzamos la primera lentitud de las compilaciones y ahora unos dos años más tarde a pesar de las mejoras reales de Apple. la situación es tan mala como lo fue con Xcode 6. Qué irónico.

Yo en realidadDE VERDAD Lamento elegir Swift sobre Obj / C para nuestro proyecto debido a la frustración diaria que implica. (Incluso cambio a AppCode pero esa es otra historia)

De todos modos, veo que esta publicación SO tiene más de 32k vistas y 143 ups al momento de escribir esto, así que supongo que no soy el único. Esperen, muchachos, a pesar de ser pesimistas sobre esta situación, puede haber algo de luz al final del túnel.

Si tienes tiempo (¡y coraje!), Supongo que Apple da la bienvenida al radar sobre esto.

¡Hasta la próxima! Salud

ACTUALIZAR con Xcode 9

Tropezar conesta hoy. Xcode presentó silenciosamente un nuevo sistema de compilación para mejorar el horrible desempeño actual. Debe habilitarlo a través de la configuración del espacio de trabajo.

Ya lo probé, pero actualizaré esta publicación una vez que haya terminado. Sin embargo, parece prometedor.

Respuestas a la pregunta(21)

Su respuesta a la pregunta