37 votes

Xcode 8 très lent à compiler Swift

Depuis Swift 3 et Xcode 8, mon projet se compile assez lentement. Chaque fois que j'ajoute ne serait-ce qu'une ligne vide à un fichier, la recompilation prend une minute entière. Lorsque je vérifie la sortie, il n'y a pas de fichier particulier qui prend beaucoup de temps. (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 régulier. Juste très lent...

En outre : Chaque fois que j'ouvre un fichier ou que je passe d'un fichier à l'autre, il peut s'écouler beaucoup de temps avant que je n'obtienne la saisie automatique, ou des erreurs ou des avertissements.

Quels sont les points à vérifier ? J'ai presque l'impression qu'il y a un drapeau que j'ai mis en place et qui fait baisser la vitesse de construction comme un fou

EDITAR: Ce n'est pas une solution au problème sous-jacent, mais j'ai passé du temps à transférer plus de code vers des frameworks. Cela a fait une différence (simplement parce qu'il faut recompiler moins de fichiers à chaque fois). Cela ne devrait pas être nécessaire, mais c'est devenu insupportable... Je suis bien sûr toujours à la recherche d'une solution adéquate.

0 votes

Voir si este fonctionne pour vous. Je suppose que vous avez essayé de redémarrer votre Mac, Xcode, votre projet, de nettoyer votre projet, etc.

2 votes

Même chose pour moi. j'ai un macbook 15inch 2,5ghz vieux de 9 mois. le prix était de presque 3k. il se comportait comme le Flash dans xcode 7 comparé à ce qui se passe ici dans xcode 8. les storyboards mettent un an à s'ouvrir et le temps de compilation a au moins triplé. j'espère juste qu'il y aura des mises à jour.

0 votes

Et @YashTamakuwala bon sang, tu m'as donné de l'espoir avec ce lien, mais mon Build Active Architectures Only est déjà défini YES par défaut :(

28voto

Le problème est que nous ne savons pas où se trouve la mauvaise initialisation/déclaration. Une solution proposée par mon collègue est de trouver la fonction qui prend le plus de temps à compiler :

  1. Ir a 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)

ensuite, un avertissement doit s'afficher comme suit :

La vérification du type de l'élément 'frameDescription' a pris 108 ms (limite : 50 ms)

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

1 votes

Vous êtes le meilleur Mon BRo

1 votes

@hardik.shah son collègue est le meilleur ;)

5voto

Ben Simon Points 111

Je n'ai le même problème que depuis la mise à jour vers Swift 3/XCode 8 et il semble être causé par de grands tableaux littéraux, similaires à este .

J'ai pu résoudre le problème en ajoutant des annotations de type aux variables affectées au littéral du 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"]

0 votes

Le fait d'avoir des tableaux littéraux de grande taille entraîne actuellement des problèmes de performance. Mais (comme indiqué dans ma question) il n'y a pas de classes qui se distinguent particulièrement au moment de la compilation. Si quelqu'un souffre de longs temps de compilation, il devrait certainement vérifier cette possibilité, mais dans mon cas, c'est quelque chose de différent.

0 votes

L'avez-vous signalé dans un radar ? Cela ne devrait pas se produire. J'ai remarqué que cela ne fonctionne pas si vous dites :[String] comme type. Seule l'utilisation de la notation générique semble résoudre le problème. Merci d'avoir posté ce message.

5voto

Vlad Points 61

Il s'agit d'un problème avec Xcode 8 qui n'effectue pas correctement les compilations incrémentales. Si vous éditez un seul fichier swift, il ne devrait compiler que ce fichier. Ce problème a déjà été soulevé ici : Xcode 8 reconstruit entièrement le projet

La construction de 4 fichiers à la fois donne l'impression que Xcode effectue une reconstruction complète du projet, ce qui ne devrait pas se reproduire si vous n'avez modifié qu'une seule ligne dans un fichier.

2 votes

J'ai vu une note ici ( forums.developer.apple.com/thread/19342 ) que si des fichiers ont des avertissements, xcode reconstruira le projet entier plutôt que les changements incrémentaux. J'ai supprimé mes avertissements et cela a semblé aider.

4voto

bibscy Points 1008

Dans mon cas, j'utilisais une fonction d'aide pour sauvegarder des données dans Firebase. Cette fonction retournait un dictionnaire avec environ 20 éléments et cela prenait environ 40 minutes à compiler. Ma solution a été d'initialiser un dictionnaire vide et d'ajouter les éléments un par un à someDict . Maintenant, il compile en moins de 30 secondes. J'espère que cela vous aidera.

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
}

1voto

Gerard Grundy Points 546

Cela a fonctionné pour moi dans le cadre d'un de mes projets.

Allez dans Produit -> Schéma -> Modifier le schéma. Sélectionnez Build dans la colonne de gauche et décochez "Find implicit dependencies" (trouver les dépendances implicites). rester coché lorsque vous construisez le projet pour la première fois .

Source

Il s'agissait d'un projet simple qui a permis de faire passer une de mes constructions de 1 minute à 2 secondes.

Sur un dispositif physique, j'ai obtenu les résultats suivants. Pour l'un de mes projets les plus importants (42 fichiers), je l'ai seulement réduit de 2:36 à 2:20. Puis j'ai ajouté : SWIFT_WHOLE_MODULE_OPTIMIZATION = YES aux paramètres de construction en tant que paramètre défini par l'utilisateur. Le temps est passé à - 2:00

Sur le simulateur, la construction a duré 49 secondes la première fois, puis j'ai utilisé.

Allez dans Produit -> Schéma -> Modifier le schéma. Sélectionnez Build dans la colonne de gauche et décochez "Find implicit dependencies" (trouver les dépendances implicites). rester coché lorsque vous construisez le projet pour la première fois .

et la construction a pris 7 secondes.

J'espère que cela vous aidera.

0 votes

Pour moi, "module optimization" a réduit le temps de construction de 30%, "no implicit dependencies" d'environ 70-80% (même si ce dernier est plus un paramètre temporaire, car il ne fonctionnera pas après un nettoyage, au moins lors de l'utilisation de pods).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X