para - xcode simulator
Tiempo de compilación increíblemente lento (8)
Mi proyecto consta de ~ 350 archivos Swift y ~ 40 dependencias de vaina de cacao.
Tan pronto como se migró todo el proyecto a
Swift 3
, los tiempos de compilación han sido
INCREÍBLEMENTE
lentos y la compilación completa tardó un poco más de 3 minutos.
Me di cuenta de que si reconstruyo después de no cambiar ningún archivo, se construye dentro de un período de tiempo razonable.
Sin embargo, si agrego una nueva función, me llevará más de 3 minutos.
Cocoapods no parece estar causando el problema, ya que se retrasa al
Compiling Swift source files
estado de los
Compiling Swift source files
.
Seguí this para investigar:
-
-Xfrontend -debug-time-function-bodies
a misOther Swift Flags
-Xfrontend -debug-time-function-bodies
en la configuración de compilación de mi objetivo -
Construye el proyecto
-
Copié esto en la terminal y ejecuté
pbpaste | egrep ''/.[0-9]ms'' | sort -t "." -k 1 -n | tail -100
pbpaste | egrep ''/.[0-9]ms'' | sort -t "." -k 1 -n | tail -100
Sin embargo, no vi nada de preocupación. El archivo que tardó más en compilarse fue de solo 250 ms. El siguiente valor más cercano fue de 100 ms, incluso si los 350 archivos tardaran 250 ms en compilarse, eso sería solo un total de 73 segundos, lo que está muy lejos de las compilaciones de más de 3 minutos que estoy viendo.
¿Qué podría estar causando estos largos tiempos de compilación?
Nunca fue tan lento antes de actualizar a
Xcode 8
y
Swift 3
.
Actualización 1:
Creé un nuevo proyecto sin ejecutar la conversión
Swift 3
, importé mis archivos
Swift 3
, pero el tiempo de compilación sigue siendo el mismo.
Actualización 2:
He intentado
SWIFT_WHOLE_MODULE_OPTIMIZATION = YES
, pero tan pronto como realice cambios en más de 1 archivo, la compilación incremental falla y desencadena una reconstrucción que dura más de 4-5 minutos.
Actualización 3:
Ahora he reescrito todo mi código base de
Swift 3
a
Swift 2.3
.
No hizo ninguna diferencia, el problema radica en el compilador
Xcode 8
.
Actualización 4:
Puedo confirmar que desmarcando estos dos
Aliviará el dolor por un tiempo, el error
Xcode 8
parece estar relacionado con la forma en que verifica las dependencias entre los archivos.
Actualización 5:
He convertido mi base de código a
Swift 3
desde
Swift 2.3
ya que
Xcode 8.2
beta lo requiere, la beta debería incluir una solución para "Xcode no reconstruirá un objetivo completo cuando solo se hayan producido pequeños cambios (28892475)".
Lamentablemente, no han solucionado el error y mis tiempos de compilación son exactamente los mismos con
Xcode 8.2 Beta
.
Publicación original:
No tengo suficiente reputación para comentar, pero todavía quería compartir algunos recursos.
He estado atrapado en esta miseria durante días, la actualización a
Swift 3
ha sido un completo desastre.
Estoy usando esto para rastrear archivos lentos, aunque como tú, ese no es mi problema. Algo más en xcode está tardando literalmente 4 minutos en completarse: https://github.com/irskep/swift_compile_times_parser https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode
También me aseguré de no tener
lazy vars
o
closures
lazy vars
que a Swift no le gusten.
No use el
+ operator
cuando concatene cadenas, etc.
vea esto
.
Actualizaré esta respuesta si encuentro algo, es casi imposible ser productivo con
Swift 3
ATM.
Cada vez que se enfrente a un problema de compilación lenta, observe detenidamente los SDK de terceros que incluyó en su aplicación y también intente encontrar sus técnicas de codificación.
Enfrenté este problema dos veces en mi aplicación y me sentí acosado por Swift 3 😡. Las razones de los tiempos eran diferentes.
La primera vez que encontré que agregué una biblioteca en mi aplicación llamada AASignatureView . Desde que se agregó esta lib, mi tiempo de compilación aumentó como el infierno. Comenzó a tomar cerca de 12-15 minutos en ejecutar la aplicación en el simulador. El problema se resolvió después de eliminar esta biblioteca de mi código y agregar VMSignatureView y mi tiempo de compilación entró en estado normal.
La segunda vez me enfrenté a este problema después de hacer un código para agregar varias cadenas. Los dos métodos siguientes convirtieron el tiempo de compilación de la aplicación en un infierno
a = a + b
y
a += b
Luego cambié mi código a continuación y el problema se resolvió.
a = "a/(strSometihng),/(strAnother)"
Encontré un par de estilos de codificación que llevan mucho tiempo compilar en Swift (2.3, no probado en 3):
a += b
Debiera ser
a = a + b
También agregando matriz juntos:
var a = [1,3,4]
var b = [5,6,7,8]
var c = [8,4,3,5]
var d = a + b + c
Debiera ser
var a = [1,3,4]
var b = [5,6,7,8]
var c = [8,4,3,5]
var d : [Int] = []
d.appendContentsOf(a)
d.appendContentsOf(b)
d.appendContentsOf(c)
La última optimización tomó el tiempo de compilación para 1 método de 9800ms a 5.5ms ...
Estoy usando Xcode 8.1 Mi problema fue con el diccionario que usa el
Nil-Coalescing Operator
Este es mi código cuando toma 10 minutos construir:
let params: [String:String] = [
"email": email ?? self.email,
"clave": password,
"tipo_documento": documentType?.rawValue ?? self.typeDocument.rawValue,
"documento": number ?? self.documentNumber,
"nombre": name ?? self.name,
"apellidos": lastName ?? self.lastName,
"fecha_nacimiento": birth?.parse() ?? self.birthDate.parse(),
"genero": genre?.rawValue ?? self.genre.rawValue,
"telefono_movil": cel ?? self.cel,
"direccion": address ?? self.address
]
No sé por qué, pero me anuncia que el Diccionario tarda mucho en compilarse.
Luego lo cambio a:
var params: [String:String] = [:]
params["email"] = email ?? self.email
params["clave"] = password
params["tipo_documento"] = documentType?.rawValue ?? self.typeDocument.rawValue
params["documento"] = number ?? self.documentNumber
params["nombre"] = name ?? self.name
params["apellidos"] = lastName ?? self.lastName
params["fecha_nacimiento"] = birth?.parse() ?? self.birthDate.parse()
params["genero"] = genre?.rawValue ?? self.genre.rawValue
params["telefono_movil"] = cel ?? self.cel
params["direccion"] = address ?? self.address
Espero que pueda ayudar a algunos de ustedes.
La concatenación de varias cadenas también puede aumentar los tiempos de compilación, por ejemplo, en mi caso, mis tiempos de compilación eran muy altos debido a esta línea:
let fecha = post.dia + " " + post.num_dia + " " + post.mes + " - " + post.hora
Cuando cambié el código a esto, comenzó a compilar en segundos:
var fecha = post.dia!
fecha = fecha + " "
fecha = fecha + post.num_dia!
fecha = fecha + " "
fecha = fecha + post.mes!
fecha = fecha + " - "
fecha = fecha + post.hora!
Migré un proyecto Swift 2x de 17 archivos a Swift 3 y tuve 28 advertencias y 55 errores en todos los archivos. El tiempo de compilación fue de 4-5 minutos.
Deshabilitar
Find Implicit Dependancies
en esquema y
SWIFT_WHOLE_MODULE_OPTIMIZATION = YES
hecho solo mejoras menores.
Como eventualmente borré las advertencias y los errores en cada archivo, el tiempo de compilación se redujo y ahora está en segundos. El IDE vuelve a comportarse como debería, detectando errores casi en tiempo real y compilando rápidamente.
En primer lugar, parece que el compilador está volviendo a compilar (o al menos verificar) todos los archivos con algún error o advertencia, incluso si no ha editado ese archivo desde la última compilación.
En segundo lugar, si hay demasiados errores / advertencias dependientes en los archivos, el compilador se cuela y se ralentiza.
También la
string concatenation
parece ser increíblemente lenta en Swift3 / XCode8:
item.text = item.text + " " + pickerText + " " + (attribute?.Prefix ?? "") + inputText + (attribute?.Suffix ?? "")
~ tomó 8-10 segundos para compilar
item.text = "/(item.text) /(pickerText) /(attribute?.Prefix ?? "")/(inputText)/(attribute?.Suffix ?? "")"
~ tardó 1,6 segundos en compilar
item.text = [item.text, " ", pickerText, " ", (attribute?.Prefix ?? ""), inputText, (attribute?.Suffix ?? "")].joined();
~ tardó 0,001 segundos en compilar
SWIFT_WHOLE_MODULE_OPTIMIZATION = YES
Versión Xcode: 8.1 GM
Para agregar, elija su objetivo, luego vaya a
Editor > Add Build Setting > Add User-Defined Setting
y agregue lo anterior.
Mi tiempo de construcción limpio se redujo de 35 minutos (ejem, perdón) a 8 minutos con un recuento de archivos de proyecto de 800.
Nota: Probé esto en Xcode 8.0 primero, pero no funcionó.