J'utilise Xcode 6 Beta 6.
C'est quelque chose qui me dérange depuis un certain temps maintenant, mais il atteint un point où il est à peine utilisable maintenant.
Mon projet commence à avoir une taille décente de 65 fichiers Swift et quelques fichiers Objective-C pontés (qui ne sont vraiment pas la cause du problème).
Il semble que toute légère modification d'un fichier Swift (comme l'ajout d'un simple espace blanc dans une classe à peine utilisée dans l'application) entraînera la recompilation de tous les fichiers Swift de la cible spécifiée.
Après une enquête plus approfondie, j'ai trouvé que ce qui prend à peu près 100% du temps du compilateur est la CompileSwift
phase où Xcode exécute la swiftc
commande sur tous les fichiers Swift de votre cible.
J'ai fait une enquête plus approfondie, et si je ne garde que le délégué de l'application avec un contrôleur par défaut, la compilation est très rapide, mais comme j'ajoutais de plus en plus de mes fichiers de projet, le temps de compilation commençait à devenir très lent.
Maintenant, avec seulement 65 fichiers source, il faut environ 8/10 secondes pour compiler à chaque fois. Pas très rapide du tout.
Je n'ai vu aucun article parler de ce problème, sauf celui-ci , mais c'était une ancienne version de Xcode 6. Je me demande donc si je suis le seul dans ce cas.
METTRE À JOUR
J'ai vérifié quelques projets Swift sur GitHub comme Alamofire , Euler et CryptoSwift , mais aucun d'entre eux n'avait suffisamment de fichiers Swift pour vraiment les comparer. Le seul projet que j'ai trouvé qui commençait à avoir une taille décente était SwiftHN , et même s'il n'avait qu'une douzaine de fichiers source, je pouvais toujours vérifier la même chose, un espace simple et l'ensemble du projet avait besoin d'une recompilation qui commençait à prendre un peu de temps (2/3 secondes).
Comparé au code Objective-C où l'analyseur et la compilation sont rapides, cela donne vraiment l'impression que Swift ne pourra jamais gérer de gros projets, mais dites-moi que je me trompe.
MISE À JOUR Avec Xcode 6 Beta 7
Toujours aucune amélioration. Cela commence à devenir ridicule. Avec l'absence de #import
Swift, je ne vois vraiment pas comment Apple pourra jamais optimiser cela.
MISE À JOUR Avec Xcode 6.3 et Swift 1.2
Apple a ajouté des versions incrémentielles (et de nombreuses autres optimisations du compilateur). Vous devez migrer votre code vers Swift 1.2 pour voir ces avantages, mais Apple a ajouté un outil dans Xcode 6.3 pour vous y aider:
TOUTEFOIS
Ne te réjouis pas trop vite comme moi. Le solveur de graphes qu'ils utilisent pour rendre la construction incrémentielle n'est pas encore très bien optimisé.
En effet, tout d'abord, il ne regarde pas les changements de signature de fonction, donc si vous ajoutez un espace dans le bloc d'une méthode, tous les fichiers dépendant de cette classe seront recompilés.
Deuxièmement, il semble créer l'arborescence sur la base des fichiers qui ont été recompilés même si une modification ne les affecte pas. Par exemple, si vous déplacez ces trois classes dans des fichiers différents
class FileA: NSObject {
var foo:String?
}
class FileB: NSObject {
var bar:FileA?
}
class FileC: NSObject {
var baz:FileB?
}
Maintenant, si vous modifiez FileA
, le compilateur marquera évidemment FileA
pour être recompilé. Il sera également recompilé FileB
(ce serait bien en fonction des modifications apportées à FileA
), mais aussi FileC
parce qu'il FileB
est recompilé, et c'est assez mauvais car FileC
jamais utilisé FileA
ici.
J'espère donc qu'ils amélioreront ce solveur d'arbre de dépendance ... J'ai ouvert un radar avec cet exemple de code.
MISE À JOUR Avec Xcode 7 beta 5 et Swift 2.0
Hier, Apple a publié la version bêta 5 et à l'intérieur des notes de version, nous pouvions voir:
Swift Language & Compiler • Constructions incrémentielles: changer uniquement le corps d'une fonction ne devrait plus entraîner la reconstruction des fichiers dépendants. (15352929)
Je l'ai essayé et je dois dire que ça fonctionne vraiment (vraiment!) Bien maintenant. Ils ont grandement optimisé les versions incrémentielles de Swift.
Je vous recommande fortement de créer une swift2.0
branche et de maintenir votre code à jour à l'aide de XCode 7 beta 5. Vous serez satisfait des améliorations du compilateur (mais je dirais que l'état global de XCode 7 est toujours lent et bogué)
MISE À JOUR Avec Xcode 8.2
Cela fait un moment depuis ma dernière mise à jour sur ce problème alors le voici.
Notre application compte maintenant environ 20 000 lignes de code Swift presque exclusivement, ce qui est décent mais pas exceptionnel. Il a subi une migration rapide 2 et plus rapide que 3. Il faut environ 5 / 6m pour compiler sur un Macbook pro mi-2014 (Intel Core i7 2,5 GHz), ce qui est correct sur une version propre.
Cependant, la construction incrémentielle est toujours une blague malgré Apple affirmant que:
Xcode ne reconstruira pas une cible entière lorsque seuls de petits changements se sont produits. (28892475)
Évidemment, je pense que beaucoup d'entre nous ont juste ri après avoir vérifié ce non-sens (l'ajout d'une propriété privée (privée!) À n'importe quel fichier de mon projet recompilera le tout ...)
Je voudrais vous signaler ce fil sur les forums de développeurs Apple qui contient de plus amples informations sur le problème (ainsi que la communication appréciée des développeurs Apple à ce sujet de temps en temps)
Fondamentalement, les gens ont trouvé quelques choses pour essayer d'améliorer la construction incrémentielle:
- Ajouter un
HEADER_MAP_USES_VFS
paramètre de projet défini surtrue
- Désactiver
Find implicit dependencies
de votre schéma - Créez un nouveau projet et déplacez votre hiérarchie de fichiers vers le nouveau.
J'essaierai la solution 3 mais la solution 1/2 n'a pas fonctionné pour nous.
Ce qui est ironiquement drôle dans toute cette situation, c'est qu'en regardant le premier post sur ce problème, nous utilisions Xcode 6 avec je crois que le code swift 1 ou swift 1.1 lorsque nous avons atteint la première lenteur des compilations et maintenant environ deux ans plus tard malgré les améliorations réelles d'Apple le la situation est aussi mauvaise qu'elle l'était avec Xcode 6. Quelle ironie.
Je regrette vraiment d'avoir choisi Swift plutôt que Obj / C pour notre projet en raison de la frustration quotidienne que cela implique. (Je passe même à AppCode mais c'est une autre histoire)
Quoi qu'il en soit, je vois que ce message SO a 32k + vues et 143 ups à ce jour, donc je suppose que je ne suis pas le seul. Accrochez-vous les gars malgré le pessimisme de cette situation, il pourrait y avoir de la lumière au bout du tunnel.
Si vous avez le temps (et le courage!), Je suppose qu'Apple se réjouit du radar à ce sujet.
Jusqu'à la prochaine fois! À votre santé
MISE À JOUR Avec Xcode 9
Trébuchez sur cela aujourd'hui. Xcode a discrètement introduit un nouveau système de construction pour améliorer les performances horribles actuelles. Vous devez l'activer via les paramètres de l'espace de travail.
J'ai déjà essayé, mais je mettrai à jour ce message une fois terminé. Cela semble prometteur.