XCode 8 compilation rápida muy lenta

Desde Swift 3 y XCode8 mi proyecto se comstack muy lentamente. Cada vez que agrego una línea vacía a un file, la recompilation tarda un minuto completo. Cuando verifico el resultado, no hay un file en particular que demore mucho. (También utilicé esta herramienta para medirla: https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode )

Siempre parece comstackr 4 files a la vez. El "ritmo" es bastante constante. Solo muy lento …

Además: Cada vez que abro o cambio entre files, puede llevar mucho time hasta get autocomplete, o errores / advertencias.

¿Qué cosas puedo comprobar? Casi siento que hay una bandera que establecí que simplemente arrastra la velocidad de compilation como loca …

EDITAR: Esta no es una solución al problema subyacente, pero dediqué un poco de time a mover más código a los frameworks. Esto marcó la diferencia (simplemente porque tiene que recomstackr less files cada vez). Esto no debería ser necesario, pero se volvió insoportable … Por supuesto, todavía estoy buscando una solución adecuada.

Un problema con este problema es que no sabemos dónde está la initialization / statement incorrecta. Una solución que mi colega sugiere es encontrar qué function lleva mucho time comstackr así:

  1. Ir a Project selecciona tu objective
  2. Build Settings -> Swift Compiler - Custom Flags
  3. Agregar a Other Swift Flags -Xfrontend -warn-long-function-bodies=50 (50 representan el time en milisegundos)

después de eso, una advertencia debería mostrarse de la siguiente manera:

Getter 'frameDescription' tardó 108 ms en escribir-check (límite: 50 ms)

y después de eso sabes qué hacer;)

He tenido el mismo problema solo desde la actualización a Swift 3 / XCode 8 y parece ser causada por grandes literales de matriz, similares a esto .

Pude solucionar el problema agregando annotations de tipo a las variables que se asignaron al literal de la matriz, por ejemplo

 let array: Array<String> = ["1", "2", "3", "4", "5", "6", "7", "8"] 

en lugar de

 let array = ["1", "2", "3", "4", "5", "6", "7", "8"] 

Este es un problema con Xcode 8 donde no realiza comstackciones incrementales correctamente. Si edita un solo file rápido, debería comstackr solo ese file. Esto ya se ha planteado aquí: Xcode 8 hace reconstrucción completa del proyecto

Los 4 files a la vez build suena como Xcode está realizando una reconstrucción completa del proyecto que no debería volver a suceder si solo modificas una sola línea en un file.

En mi caso, estaba usando una function auxiliar para save algunos datos en Firebase. Esa function estaba devolviendo un dictionary con aproximadamente 20 elementos y tomaría unos 40 minutos para comstackr. Mi solución fue inicializar un dictionary vacío y luego agregar los elementos uno por uno a someDict . Ahora se comstack en less de 30 segundos. Espero que ayude.

antes de

 func toAnyObject() -> AnyObject { return ["BookingAmount":BookingAmount, "BookingNumber":BookingNumber, "PostCode":PostCode, "SelectedBathRow":SelectedBathRow, "SelectedBedRow":SelectedBedRow, "DateAndTime":DateAndTime, "TimeStampDateAndTime":TimeStampDateAndTime, "TimeStampBookingSavedInDB": TimeStampBookingSavedInDB, "FrequencyName":FrequencyName, "FrequecyAmount":FrequecyAmount, "insideCabinets": insideCabinets, "insideFridge": insideFridge, "insideOven": insideOven, "laundryWash": laundryWash, "interiorWindows": interiorWindows, "FullName":FullName, "SuppliesName":SuppliesName, "SuppliesAmount":SuppliesAmount, "FlatNumber":FlatNumber, "StreetAddress":StreetAddress, "PhoneNumber":PhoneNumber, "EmailAddress":EmailAddress] as AnyObject } 

Después

  func toAnyObject() -> AnyObject { var someDict = [String : AnyObject]() someDict["BookingAmount"] = self.BookingAmount as AnyObject? someDict["BookingNumber"] = self.BookingNumber as AnyObject? someDict["PostCode"] = self.PostCode as AnyObject? someDict["SelectedBathRow"] = self.SelectedBathRow as AnyObject? someDict["SelectedBedRow"] = self.SelectedBedRow as AnyObject? someDict["DateAndTime"] = self.DateAndTime as AnyObject? someDict["TimeStampDateAndTime"] = self.TimeStampDateAndTime as AnyObject? someDict["TimeStampBookingSavedInDB"] = self.TimeStampBookingSavedInDB as AnyObject? someDict["FrequencyName"] = self.FrequencyName as AnyObject? someDict["FrequecyAmount"] = self.FrequecyAmount as AnyObject? someDict["insideCabinets"] = self.insideCabinets as AnyObject? someDict["insideFridge"] = self.insideFridge as AnyObject? someDict["insideOven"] = self.insideOven as AnyObject? someDict["laundryWash"] = self.laundryWash as AnyObject? someDict["interiorWindows"] = self.interiorWindows as AnyObject? someDict["FullName"] = self.FullName as AnyObject? someDict["SuppliesName"] = self.SuppliesName as AnyObject? someDict["SuppliesAmount"] = self.SuppliesAmount as AnyObject? someDict["FlatNumber"] = self.FlatNumber as AnyObject? someDict["StreetAddress"] = self.StreetAddress as AnyObject? someDict["PhoneNumber"] = self.PhoneNumber as AnyObject? someDict["EmailAddress"] = self.EmailAddress as AnyObject? return someDict as AnyObject } 

Pude networkingucir enormemente mis times de compilation de proyectos rápidos evitando el uso del operador Nil-Coalescing y la concatenación de cadenas.

En otras palabras donde tuve algo como:

 let x = "one" + object.nullableProperty ?? "" 

Lo cambié a

 let x = String(format: "one %@", object.nullableProperty ?? "") 

Mis times de compilation se han networkingucido drásticamente: de 20 minutos a 20 segundos.

Asegúrese de no combinar arrays como let combinedArrays = array1 + array2 Array let combinedArrays = array1 + array2 . También hay un error conocido para la inferencia de tipo aquí, en el que Swift pierde el time tratando de averiguar qué tipo deberían ser los combinedArrays . En cambio, [array1, array2].joined() debería funcionar igual de bien y comstackr mucho más rápido.

Una práctica común que ralentiza el time de compilation es usar Array.append y String.append (o sus equivalentes de operador + ). Para String s, es mejor usar una cadena formateada, entonces en lugar de

 let hello = "Hello, " let world = "World!" let combinedString = hello + world 

Deberías usar

 let combinedString = "\(hello)\(world)" 

No puedo recordar la aceleración exacta, pero fue del order de 10 veces para esas líneas en particular. Las probabilidades son, pensó, que esto no tendrá una aceleración notable para ninguno de los proyectos más pequeños. Por ejemplo, nuestro proyecto tiene cientos de files Swift, así como muchos Objective-C, y nuestros times de compilation son a menudo de 10 minutos o más, a veces incluso cuando el único cambio fue a un file que no es Swift .

Esto funcionó para mí en uno de mis proyectos.

Vaya a Producto -> Esquema -> Editar esquema. Seleccione Generar en la columna del lado izquierdo y desmarque "Buscar dependencies implícitas". Pero este indicador debe permanecer marcado cuando esté construyendo el proyecto por primera vez.

Fuente

Fue un proyecto simple y aumentó una de mis comstackciones de 1 minuto a 2 segundos.

En un dispositivo físico obtuve estos resultados. Para uno de mis proyectos más grandes (42 files) en solo disminuyó de 2:36 a 2:20. Luego agregué: SWIFT_WHOLE_MODULE_OPTIMIZATION = YES para crear configuraciones como una configuration definida por el usuario. El time bajó a las 2:00

En el simulador, la construcción fue de 49 segundos la primera vez que lo utilicé.

Vaya a Producto -> Esquema -> Editar esquema. Seleccione Generar en la columna del lado izquierdo y desmarque "Buscar dependencies implícitas". Pero este indicador debe permanecer marcado cuando esté construyendo el proyecto por primera vez.

y la construcción demoró 7 segundos.

Espero que esto ayude.