optimizar mini lento bar acelerar ios swift xcode swift3 xcode8

ios - mini - XCode 8 compilación rápida muy lenta



optimizar iphone (8)

Desde Swift 3 y XCode8 mi proyecto se compila bastante despacio. Cada vez que agrego tanto como una línea vacía a un archivo, la recompilación toma un minuto completo. Cuando verifico el resultado, no hay ningún archivo en particular que lleve mucho tiempo. (También utilicé esta herramienta para medirlo: https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode )

Siempre parece compilar 4 archivos a la vez. El "ritmo" es bastante estable. Solo muy lento ...

Además: cada vez que abro o cambio de un archivo a otro, puede llevar mucho tiempo hasta que obtenga la función de autocompletar o errores / advertencias.

¿Qué cosas puedo verificar? Casi siento que hay una bandera que establezco que simplemente arrastra la velocidad de construcción como loca ...

EDITAR: Esta no es una solución al problema subyacente, pero pasé algún tiempo moviendo más código a frameworks. Esto marcó la diferencia (simplemente porque tiene que volver a compilar menos archivos cada vez). Esto no debería ser necesario, pero se hizo insoportable ... Por supuesto, sigo buscando una solución adecuada.


Asegúrese de no combinar matrices como let combinedArrays = array1 + array2 . También hay un error conocido para la inferencia de tipo aquí, donde Swift pierde el tiempo tratando de averiguar qué tipo deberían ser las combinedArrays . En su lugar, [array1, array2].joined() debería funcionar igual de bien y compilarse mucho más rápido.


En mi caso, estaba usando una función auxiliar para guardar algunos datos en Firebase. Esa función devolvía un diccionario con aproximadamente 20 elementos y tardaría unos 40 minutos en compilarse. Mi solución fue inicializar un diccionario vacío y luego agregar los elementos uno a uno a someDict . Ahora se compila en menos 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 }


Este es un problema con Xcode 8 donde no realiza construcciones incrementales correctamente. Si edita un único archivo rápido, solo debe compilar ese archivo. Esto ya se ha mencionado aquí: Xcode 8 hace una reconstrucción completa del proyecto

La creación de 4 archivos a la vez suena como que Xcode está realizando una reconstrucción completa del proyecto, lo que no debería volver a suceder si solo se modifica una sola línea en un archivo.


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

Vaya a Producto -> Esquema -> Editar esquema. Seleccione Construir en la columna del lado izquierdo y desmarque "Buscar dependencias implícitas". Pero esta bandera debe permanecer marcada cuando construya el proyecto por primera vez.

Source

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

En un dispositivo físico obtuve estos resultados. Para uno de mis proyectos más grandes (42 archivos) solo disminuyó de 2:36 a 2:20. Luego agregué: SWIFT_WHOLE_MODULE_OPTIMIZATION = YES a Build Settings como una configuración definida por el usuario. El tiempo bajó a - 2:00

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

Vaya a Producto -> Esquema -> Editar esquema. Seleccione Construir en la columna del lado izquierdo y desmarque "Buscar dependencias implícitas". Pero esta bandera debe permanecer marcada cuando construya el proyecto por primera vez.

y la construcción tomó 7 segundos.

Espero que esto ayude.


He tenido el mismo problema solo desde que actualicé a Swift 3 / XCode 8 y parece ser causado por literales de matrices grandes, similares a this .

Pude solucionar el problema agregando anotaciones de tipo a las variables que se asignan 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"]


Pude reducir en gran medida mis rápidos tiempos de compilación de proyectos al evitar el uso del operador de nil-coalescencia y la concatenación de cadenas.

En otras palabras donde tuve algo así como:

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

Lo cambié a

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

Mis tiempos de compilación han disminuido drásticamente, de 20 minutos a 20 segundos.


Un problema con este problema es que no sabemos dónde está la inicialización / declaración incorrecta. Una solución que mi colega sugiere es encontrar qué función toma mucho tiempo para compilarla:

  1. Ir a Project seleccione su objetivo
  2. Build Settings -> Swift Compiler - Custom Flags
  3. Agregar a Other Swift Flags -Xfrontend -warn-long-function-bodies=50 Other Swift Flags -Xfrontend -warn-long-function-bodies=50 (50 representan el tiempo en milisegundos)

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

Getter ''frameDescription'' tardó 108ms en verificar el tipo (límite: 50ms)

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


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

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

Deberías usar

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

No recuerdo la aceleración exacta, pero fue del orden de 10 veces para esas líneas en particular. Las probabilidades son, pensaron, que esto no tendrá una aceleración notable para los proyectos más pequeños. Por ejemplo, nuestro proyecto tiene cientos de archivos Swift, así como muchos Objective-C, y nuestros tiempos de compilación suelen ser de 10 minutos o más, a veces incluso cuando el único cambio fue en un archivo no Swift .