web-dev-qa-db-fra.com

XCode 8 compilation très rapide de Swift

Depuis Swift 3 et XCode8, mon projet compile assez lentement . Chaque fois que j'ajoute une ligne vide à un fichier, la recompilation prend une minute complète. Lorsque je vérifie la sortie, aucun fichier particulier ne prend très longtemps . (J'ai également utilisé cet outil pour le mesurer: https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode )

Il semble toujours compiler 4 fichiers à la fois. Le "rythme" est assez stable. Juste très lent ...

Aussi: chaque fois que j'ouvre ou que je change de fichier, cela peut prendre très longtemps avant que je ne reçoive la saisie semi-automatique, ou des erreurs/avertissements.

Que puis-je vérifier? J'ai presque l'impression qu'il y a un drapeau que je mets qui ralentit la vitesse de construction comme un fou.

EDIT: Ce n'est pas une solution au problème sous-jacent, mais j'ai passé un peu de temps à déplacer davantage de code vers des frameworks. Cela a fait une différence (simplement parce qu'il doit recompiler moins de fichiers à chaque fois). Cela ne devrait pas être nécessaire, mais cela devenait insupportable ... Bien sûr, je cherche toujours une solution appropriée.

36
fancy

Un problème avec ce problème est que nous ne savons pas où se trouve la mauvaise initialisation/déclaration. Une solution que mon collègue suggère est de trouver quelle fonction est longue à compiler, de manière à:

  1. Allez à Project sélectionnez votre cible
  2. Build Settings -> Swift Compiler - Custom Flags
  3. Ajouter à Other Swift Flags-Xfrontend -warn-long-function-bodies=50 (50 représentent le temps en millisecondes)

après cela, un avertissement devrait s'afficher comme suit:

La méthode 'frameDescription' de Getter a pris 108 ms pour la vérification de type (limite: 50 ms)

et après cela, vous savez quoi faire;)

26
Constantin Saulenco

Je ne rencontre le même problème que depuis la mise à niveau vers Swift 3/XCode 8 et cela semble être dû à de grands littéraux de tableau, similaires à this .

J'ai pu résoudre le problème en ajoutant des annotations de type aux variables affectées au littéral de tableau, par exemple.

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

au lieu de

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

Ceci est un problème avec Xcode 8 où il n’effectue pas correctement les constructions incrémentielles. Si vous éditez un seul fichier Swift, il ne devrait compiler que ce fichier. Cela a déjà été soulevé ici: Xcode 8 reconstruit complètement le projet

La compilation de 4 fichiers à la fois semble indiquer que Xcode effectue une reconstruction complète du projet, ce qui ne devrait plus se produire si vous ne modifiiez qu'une seule ligne dans un seul fichier.

5
Vlad

Dans mon cas, j’utilisais une fonction d’aide pour enregistrer des données dans Firebase. Cette fonction renvoyait un dictionnaire avec environ 20 éléments et la compilation nécessiterait environ 40 minutes. Ma solution consistait à initialiser un dictionnaire vide, puis à ajouter les éléments un à un à someDict. Maintenant, il compile en moins de 30 secondes. J'espère que ça aide.

Avant  

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

}

Aprè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
}
2
bibscy

J'ai pu réduire considérablement les temps de compilation de mon projet Swift en évitant l'utilisation de l'opérateur Nil-Coalescing et la concaténation de chaînes.

En d'autres termes, j'avais quelque chose comme:

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

Je l'ai changé pour

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

Mes temps de compilation ont considérablement chuté, passant de 20 minutes à 20 secondes.

1
Logan Sease

Cela a fonctionné pour moi sur l'un de mes projets. 

Allez à Produit -> Schéma -> Éditer un schéma. Sélectionnez Construire dans le côté gauche et décochez la case "Rechercher les dépendances implicites". Mais cet indicateur doit restez coché lorsque vous construisez le projet pour la première fois ..

La source

C'était un projet simple et il a augmenté l'une de mes versions de 1 minute à 2 secondes.

Sur un appareil physique, j’ai obtenu ces résultats… .. Pour un de mes plus gros projets (42 fichiers), il n’a diminué que de 2:36 à 2:20. J'ai ajouté ensuite:

Sur le simulateur, la construction était de 49 secondes la première fois, puis utilisée.

Allez à Produit -> Schéma -> Éditer un schéma. Sélectionnez Construire dans le côté gauche et décochez la case "Rechercher les dépendances implicites". Mais cet indicateur doit restez coché lorsque vous construisez le projet pour la première fois ..

et la construction a pris 7 secondes.

J'espère que ça aide.

1
uplearnedu.com

Assurez-vous de ne pas combiner des tableaux tels que let combinedArrays = array1 + array2. Il y a également un bogue connu pour l'inférence de type ici, dans lequel Swift perd du temps à essayer de déterminer le type que devrait contenir combinedArrays. [array1, array2].joined() devrait plutôt fonctionner aussi bien et compiler beaucoup plus rapidement.

0
Dylan Gattey

Une pratique courante qui ralentit le temps de compilation utilise Array.append et String.append (ou leurs équivalents d'opérateur +). Pour Strings, il est préférable d’utiliser une chaîne formatée, donc au lieu de

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

tu devrais utiliser

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

Je ne me souviens pas de l'accélération exacte, mais c'était environ 10 fois pour ces lignes. Les chances sont, pensé, que cela n'aura pas une accélération notable pour tout sauf les projets les plus infimes. Par exemple, notre projet contient des centaines de fichiers Swift, ainsi que de nombreux fichiers Objective-C, et nos temps de compilation sont souvent de 10 minutes ou plus, parfois même lorsque le seul changement concerne un fichier non-Swift. .

0
NRitH