224 votes

Pourquoi est le moment de la compilation rapide si lent ?

Je suis en utilisant Xcode 6 Beta 6.

C'est quelque chose qui m'énerve pour un certain temps maintenant, mais il atteint un point où il est à peine utilisable.

Mon projet commence à avoir un décent taille de 65 swift fichiers et quelques comblé objc fichiers (qui sont vraiment pas la cause du problème).

Il semble que la moindre modification à toute swift fichier (comme l'ajout d'un simple espace blanc dans une classe qui est à peine utilisé dans l'app) va entraîner l'ensemble de la swift fichiers de la cible spécifiée être recompilés.

Après une enquête plus approfondie, j'ai trouvé que ce qui est en train près de 100% du compilateur temps est l' CompileSwift phase où xcode exécute l' swiftc commande sur tous les swift fichiers de votre cible.

C'est ce que j'obtiens après l'ajout d'un espace à peine utilisé en classe. Les deux sommets que vous voyez sont le compilateur de l'exécution de l' CompileSwift de phase.

enter image description here

J'ai fait un peu plus d'investigation et si je ne garde que le délégué d'application avec un contrôleur par défaut la compilation est très rapide, mais comme je l'ai été d'ajouter de plus en plus de mes fichiers de projet, le temps de compilation commençais à être très lent.

Maintenant, avec seulement 65 source des fichiers. Il faut environ 8 à 10 secondes pour compiler à chaque fois. Pas très swift .

Je n'ai pas vu de post à parler de ce problème à l'exception de cette seule mais c'était une vieille version de Xcode 6. Alors je me demandais si je suis le seul dans ce cas.

Mise à JOUR

J'ai vérifié sur github quelques swift projets comme Alamofire, Euler et CryptoSwift , mais aucun d'eux n'était assez swift fichiers à comparer. Le seul projet que j'ai trouvé que c'était de départ ont décent taille a été SwiftHN, et même si elle n'avait qu'une douzaine de fichiers source que j'étais encore en mesure de vérifier la même chose, un espace simple et l'ensemble du projet nécessaires recompilation qui commençait à prendre un peu de temps (2/3 secondes).

Par rapport à ObjC code où à la fois de l'analyseur et de la compilation ultra-rapide cela se sent vraiment comme swift ne sera jamais capable de gérer de gros projets, mais s'il vous plaît dites-moi que je me trompe.

Je suis de l'ouverture de cette question pour bounty que j'espère qu'il va conduire plus de vues.

Mise à JOUR de Xcode 6 Beta 7

Toujours pas d'amélioration que ce soit. Cela commence à devenir ridicule. Avec le manque d' #import dans swift, je ne vois vraiment pas comment Apple va jamais être en mesure d'optimiser cette.

71voto

apouche Points 2000

Eh bien, il s'est avéré que Rob Napier avait raison, c'était un seul fichier (en fait une méthode) qui était à l'origine du compilateur pour aller berzek.

Maintenant, ne vous méprenez pas, Swift ne recompiler tous vos fichiers à chaque fois, mais la grande chose, c'est que maintenant Apple a ajouté en temps réel de la compilation des commentaires sur les fichiers qu'il compile, donc XCode 6 GM montre maintenant qui swift fichiers sont en cours de compilation et de l'état de la compilation en temps réel comme vous pouvez le voir dans cette capture d'écran:

enter image description here

Si cela vient très pratique pour savoir qui de vos fichiers est si long. Dans mon cas, c'était ce morceau de code:

var dic = super.json().mutableCopy() as NSMutableDictionary
dic.addEntriesFromDictionary([
        "url" : self.url?.absoluteString ?? "",
        "title" : self.title ?? ""
        ])

return dic.copy() as NSDictionary

parce que la propriété title était de type var title:String? et pas NSString le compilateur était fou lors de l'ajout à l' NSMutableDictionary.

Changer l':

var dic = super.json().mutableCopy() as NSMutableDictionary
dic.addEntriesFromDictionary([
        "url" : self.url?.absoluteString ?? "",
        "title" : NSString(string: self.title ?? "")
        ])

return dic.copy() as NSDictionary

fait la compilation aller à partir de 10/15 secondes (peut-être même plus) à une seule seconde... étonnant.

Rob, désolé de la prime de la période de grâce est sur la cause que vous étiez celui qui le méritait le plus. Merci à vous tous qui ont participé à ce fil de discussion.

34voto

Rob Napier Points 92148

Il a probablement rien à voir avec la taille de votre projet. C'est probablement certains morceau de code, peut-être même qu'une ligne. Vous pouvez tester cela en essayant de compiler un fichier à la fois, plutôt que de l'ensemble du projet. Ou essayez de regarder les journaux de construction pour voir quel fichier est-ce si long.

Comme un exemple des types de code qui peuvent causer des problèmes, que ce 38 de la ligne de gist prend plus d'une minute à compiler dans beta7. Tout cela est causé par ce bloc:

let pipeResult =
seq |> filter~~ { $0 % 2 == 0 }
  |> sorted~~ { $1 < $0 }
  |> map~~ { $0.description }
  |> joinedWithCommas

Simplifier que par juste une ligne ou deux et il compile presque instantanément. Le problème, c'est quelque chose à ce sujet est à l'origine de la croissance exponentielle (éventuellement factorielle de croissance) dans le compilateur. Évidemment, ce n'est pas idéal, et si vous pouvez l'isoler de telles situations, vous devez ouvrir les radars pour aider à obtenir ces questions nettoyé.

15voto

mprudhom Points 2093

Une chose à noter est que la Swift type de moteur d'inférence peut être très lent avec les types imbriqués. Vous pouvez avoir une idée générale de ce qui est à l'origine de la lenteur en regardant le journal de génération pour chaque unités de compilation qui prennent beaucoup de temps et puis le copier-coller de l'intégralité de Xcode-engendré de commande dans une fenêtre de Terminal, puis en appuyant sur CTRL-\ pour obtenir des diagnostics. Jetez un oeil à http://blog.impathic.com/post/99647568844/debugging-slow-swift-compile-times pour un exemple complet.

9voto

Rivera Points 4219

Assurez-vous également que lors de la compilation pour le débogage (Swift ou Objective-C), vous définissez à construire Active Architecture seulement :

enter image description here

7voto

George Points 352

Depuis tout ce genre de choses est en version Bêta, et depuis le Swift est un compilateur (au moins à partir d'aujourd'hui) s'ouvre pas, je suppose qu'il n'y a pas de vraie réponse à votre question.

Tout d'abord, la comparaison Objective-C, Swift compilateur est en quelque sorte cruel. Swift est encore en version Bêta, et je suis sûr que Apple travaille en fournissant les fonctionnalités et la correction des bugs, en plus de fournir la vitesse de l'éclair (vous n'avez pas commencer à construire une maison en achetant les meubles). Je suppose que Apple va optimiser le compilateur en temps voulu.

Si, pour une raison tous les fichiers source doivent être compilées completey, une option pourrait être de créer séparés modules/bibliothèques. Mais cette option n'est pas encore possible, que Swift ne peut pas autoriser les bibliothèques jusqu'à ce que la langue est stable.

J'imagine qu'ils vont optimiser le compilateur. Pour la même raison que nous ne pouvons pas créer des modules compilés, il se pourrait bien que le compilateur a besoin de compiler tout à partir de zéro. Mais une fois la langue atteint d'une version stable et les binaires format ne change pas de plus, nous serons en mesure de créer nos bibliothèques, et peut-être (?) le compilateur va également être en mesure d'optimiser son travail.

Juste deviner, si, pour le seul Apple sait...

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