啊神的技术博客

我的小博客,小智慧

探索Xcode8编译为什么那么慢?

| 评论

背景

随着Xcode8swift3.0的正式到来,我开始着手将swift2.3的项目转到swift3(至于转换过程,这里不多做介绍,Xcode自带的转换工具,基本可以转换80%左右,剩下的自己慢慢调试即可。)但是,转到swift3只会,在用Xcode8编译,发现编译过程变得非常慢,哪怕打一个空格,都要重新编译很久。于是在网上查找解决办法,查找了半天各种方法全用,发现于事无补。
  有什么加一个HEADERMAP_USES_VFS = YES()这是地址,反正这个对我没用,感兴趣的话自己试试

针对这种情况,我就自己探索,出发点是排查哪些文件,哪些方法导致编译变慢?

探索Xcode编译,在哪些地方可以看到编译文件过程


通过多次编译查看,发现在Xcode左边栏,最后一个选项,是每次的编译运行等记录, 每行记录中都会有每次编译的文件编译记录。如下图

图1

再次查看正在编译的一条记录(正在编译的记录后面有一个转圈圈的”菊花“),发现有图中1、2两种标识, 一个绿色✅说明,这是编译完成了,另一个是灰色→箭头,说明是正在编译;此时发现灰色一直停留在这里,指向图中的文件,左边的菊花一直转个不停, 编译卡住了。这样一来就找到编译是什么文件导致的那么慢。

图2

排查文件中哪些代码导致的编译卡住?


排查的方法,采用比较笨的方法,暴力注释方法:就是注释找到卡住的文件中的所有方法里的代码,不要注释方法,再次编译,此时发现该文件很快通过编译,然后在依次解开部分方法注释,再次编译,直到发现解开某个方法的注释后,编译再次卡住,那就说明那个方法中的代码写的有问题,然后在依次注释,解开注释,排查方法中的某一行代码的问题。经过一番排查,我找到了我代码中卡住的部分代码,如下图红色圈中的代码

图3

在字典中的key对应的value,没有给直接的值,而是给出一个表达式,这样会导致Xcode8的编译速度极其慢,不知道为什么会出现这样的问题,之前的Xcode版本是没有的。

找到问题所在,解决问题就简单了,于是修改代码如下图:

图4

修改之后,再次编译,重新回到了快速编译的时代了,再也不用等上5-10分钟不等了。

以上过程,是针对我遇到的问题而言的,不知道是否存在普遍性,如若你也遇到,刚好看了我的文章,也解决了问题,那就会心一笑吧,如若你也遇到了,但是没有解决问题,也请你会心一笑吧。
这是苹果开发者提到的Xcode8编译超慢的问题,我看了下,也做了对应修改,发现对我并没有什么用, 感兴趣的话进去看看吧

有时候自己慢慢去探索出问题的所在,也是很不错的体验。


后知后觉


后来我知道了,也可以通过,查看具体的swift函数编译时间来定位哪个函数卡住了,而不用暴力注释法.
首先要到Build Settings 给 Other Swift Flags 添加一项 -Xfrontend -debug-time-function-bodies
就可以查看编译通过的文件中的函数编译时间,找到绿色✅的文件的那一行,在最后面有一个图标,点击展开具体内容,向下移动就会看到每个函数执行的具体时间。

评论