2017-10-12 5 views
4

Je cherche actuellement à optimiser le temps de compilation de mes projets. J'ai toujours su qu'il y avait quelque chose comme l'optimisation de module entier mais loin de le vérifier dans les paramètres de construction, je n'ai pas vraiment creusé plus profondément.Quelle est la différence entre SWIFT_WHOLE_MODULE_OPTIMIZATION défini par l'utilisateur et Swift Optimization Level?

Comme je le comprends:

OMM devrait se traduire par un code plus rapide exécuté mais peut augmenter légèrement le temps de compilation, en raison de la compilation des fichiers entiers du module comme un tout au lieu de compiler chaque fichier séparément en parallèle. https://swift.org/blog/whole-module-optimizations/

Il est recommandé de définir le niveau d'optimisation Swift:

  • pour Debug configuration définie à None [-Onone]
  • pour de presse configuration définie à Fast, Whole Module Optimization [-O -whole-module-optimization] comme il est pas important d'avoir la meilleure compilation le temps pour les versions occasionnelles augmente

Mais lors de la recherche quelques conseils pour diminuer la compilation pour la configuration de débogage, j'ai trouvé défini par l'utilisateur paramètre:

  • SWIFT_WHOLE_MODULE_OPTIMIZATION = YES (pour le débogage)
  • SWIFT_WHOLE_MODULE_OPTIMIZATION = NO (pour la libération)

Ce paramètre a diminué mon temps de compilation DEBUG presque dans la moitié, mais cela me rend également confus. Je n'ai pas trouvé de documentation sur ce paramètre et d'où il venait. (Ma compréhension du compilateur rapide est très basique, et je ne fonctionnait pas avec les paramètres définis par l'utilisateur avant)

Tout le monde recommande juste pour diminuer le temps de compilation sans aucune explication ni pourquoi, ni explication qui ne serait pas en un conflit avec Swift Optimization Level mentionné ci-dessus. Si je comprends bien, ce paramètre défini sur YES devrait augmenter le temps de compilation car il semble activer wmo. Par conséquent, je pense que ma compréhension de WMO, ou ce paramètre particulier est erroné.

Mes questions sont les suivantes:

  1. Quelle est la différence entre Swift Optimization Level paramètres et SWIFT_WHOLE_MODULE_OPTIMIZATION?

  2. Pourquoi SWIFT_WHOLE_MODULE_OPTIMIZATION diminue le temps de compilation?

Merci!

Répondre

3
  1. La principale différence est que whole-module-optimization fait référence à la façon dont le compilateur optimise modules et l'Swift Optimization Level fait référence à chaque compilation du fichier. Vous pouvez en savoir plus sur les différents drapeaux pour Swift Optimization Levelhere.
  2. SWIFT_WHOLE_MODULE_OPTIMIZATION améliore le temps de compilation car le compilateur a une vue plus globale sur toutes les fonctions, méthodes et relations entre les fichiers, ce qui lui permet d'ignorer les fonctions inutilisées, d'optimiser l'ordre de compilation, entre autres améliorations. Il se concentre également sur la compilation de fichiers modifiés uniquement, ce qui signifie que même si ce drapeau est activé, si vous nettoyez votre projet et supprimez le dossier de données dérivé, vous aurez toujours un temps de compilation plus important lors de la première exécution.
+0

Merci pour la réponse! Je ne suis pas sûr de l'avoir, alors s'il vous plait, supportez-moi. Si je comprends votre réponse: En général, wmo diminue le temps de compilation, mais: - En l'activant pour chaque fichier avec 'Swift Optimization Level' il compile chaque fichier avec chaque build et donc il est considéré comme une mauvaise option pour développement, mais ça va pour la libération. - Lorsque vous l'activez avec 'SWIFT_WHOLE_MODULE_OPTIMIZATION' et que vous le désactivez pour chaque fichier, il ne compile que les fichiers modifiés et est donc plus rapide. Est-ce correct? – CatDamon

+0

'-wmo' est une option * module *, cela signifie que lorsque vous l'activez, donne au compilateur une vision globale sur tous les fichiers et compile le projet entier en un seul. Cela réduit le temps car le compilateur sait ce qui a changé sur chaque fichier et comment cela peut affecter d'autres fichiers et optimise les décisions pour compiler tout ce dont il a besoin. Le * Swift Optimization Level * est un drapeau qui indique comment chaque fichier sera traité, indépendamment de l'option '-wmo' activée ou non. ** TL; DR **, oui, vous avez raison – jvrmed