53 votes

Temps de compilation incroyablement lent

Mon projet consiste à ~350 Swift fichiers et ~40 cabosse dépendances.

Dès que l'ensemble du projet a été migré en Swift 3, temps de construire ont été INCROYABLEMENT lent et a pris un peu plus de 3 minutes à la compilation complète.
J'ai remarqué que si je me reconstruire après de ne pas changer tous les fichiers, il construit à l'intérieur d'un laps de temps raisonnable. Cependant, si j'ajoute une nouvelle fonction, il prend le+ de 3 minutes.
Cocoapods ne semble pas être à l'origine du problème, comme les retards Compiling Swift source files de l'état.

J'ai suivi ce à étudier:

  1. Ajout de la -Xfrontend -debug-time-function-bodies drapeau pour ma Other Swift Flags de mon objectif de construire des paramètres

  2. Construire le projet

  3. enter image description here

  4. enter image description here

  5. Copié dans le terminal et a couru pbpaste | egrep '\.[0-9]ms' | sort -t "." -k 1 -n | tail -100

Cependant, je ne vois rien de préoccupation. Le fichier qui a pris le plus de temps à compiler était seulement 250ms. Le plus proche est à 100 ms, même si tous les fichiers 350 pris 250ms pour compiler, ce serait seulement un total de 73 secondes qui est loin de la 3+ minute construit je vois.


Ce qui pourrait être la cause de ces longs temps de compilation?

Il n'a jamais été aussi lent avant la mise à jour de Xcode 8 et Swift 3.

37voto

Alexander Selling Points 501

Mise à jour 1:

J'ai créé un nouveau projet, sans que l'exécution de l' Swift 3 de conversion, importé mon Swift 3 fichiers, mais le moment de la construction reste la même.

Mise à jour 2:

J'ai essayé d' SWIFT_WHOLE_MODULE_OPTIMIZATION = YES, mais dès que vous apportez des modifications à plus de 1 fichier, l'augmentation de l'échec de la construction et de l', il déclenche une re-construction qui dure pendant plus de 4 à 5 minutes.

Mise à jour 3:

Maintenant, j'ai ré-écrit la totalité de mon code de base est de Swift 3 de Swift 2.3. Il n'a fait aucune différence, le problème réside avec l' Xcode 8 compilateur.

Mise à jour 4:

Je peux confirmer que la désactivation de ces deux Dependency check permettront de soulager la douleur pendant un certain temps, l' Xcode 8 bug ne semble pas être liée à la façon dont il vérifie les dépendances entre les fichiers.

Mise à jour 5:

J'ai converti mon code de base est de Swift 3 de Swift 2.3 depuis Xcode 8.2 beta exige, la bêta devrait inclure un correctif pour Xcode va pas reconstruire l'ensemble de la cible lorsque seulement de petits changements ont eu lieu. (28892475)". C'est triste à dire, ils n'ont pas corrigé le bug et mon temps de compilation sont exactement les mêmes, Xcode 8.2 Beta.

Original post:

Je n'ai pas assez de réputation pour le commentaire, mais je voulais quand même partager certaines ressources. J'ai été coincé dans la misère pendant des jours, la mise à niveau d' Swift 3 a été un désastre complet.

Je suis en utilisant ce pour suivre la lente fichiers, même si, comme vous, ce n'est pas mon problème. Quelque chose d'autre dans xcode est littérale de 4 minutes: https://github.com/irskep/swift_compile_times_parser https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode

Je suis également assuré que je n'ai pas d' lazy vars ou closures que swift n'aime pas. N'utilisez pas l' + operator lors de la concaténation de chaînes de caractères, etc. voir cette.

Je vais mettre à jour cette réponse si je trouve quoi que ce soit, c'est à peu près impossible d'être productif avec l' Swift 3 ATM.

18voto

Je suis en utilisant Xcode 8.1 Mon problème était avec Dictionnaire qui utilise Nil-Coalescing Operator

c'est mon code quand il faut 10 minutes pour construire:

    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
    ]

Je ne sais pas pourquoi mais ça me faire de la publicité que le Dictionnaire de prendre un long temps de calcul.

enter image description here

Puis-je le modifier:

    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

Espérons qu'il pourrait aider certains d'entre vous.

10voto

metpb Points 338

SWIFT_WHOLE_MODULE_OPTIMIZATION = YES

Version Xcode: 8.1 GM

Pour ajouter choisissez votre cible, allez à Editor > Add Build Setting > Add User-Defined Setting et ajoutez ce qui précède.

Mon temps de construction propre est passé de 35 minutes (Ahem, excusez-moi) à 8 minutes avec un nombre de fichiers de projet de 800.

Remarque: J'ai d'abord essayé cela sur Xcode 8.0, mais cela n'a pas fonctionné.

10voto

coyer Points 1424

De plus, string concatenation semble être incroyablement lent dans Swift3 / XCode8:

 item.text = item.text + " " + pickerText + " " + (attribute?.Prefix ?? "") + inputText + (attribute?.Suffix ?? "")
 

~ a pris 8 à 10 secondes pour compiler

 item.text = "\(item.text) \(pickerText) \(attribute?.Prefix ?? "")\(inputText)\(attribute?.Suffix ?? "")"
 

~ a pris 1,6 seconde pour compiler

 item.text = [item.text, " ", pickerText, " ", (attribute?.Prefix ?? ""), inputText, (attribute?.Suffix ?? "")].joined();
 

~ a pris 0,001 seconde pour compiler

5voto

Ruud Visser Points 2516

J'ai trouvé quelques styles de codage qui prennent beaucoup de temps à compiler dans Swift (2.3, non testé sur 3):

 a += b 
 

Devrait être

 a = a + b
 

Ajoutant également un tableau ensemble:

 var a = [1,3,4]
var b = [5,6,7,8]
var c = [8,4,3,5]
var d = a + b + c
 

Devrait être

 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 dernière optimisation prenait le temps de compilation pour 1 méthode de 9800ms à 5.5ms ...

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