Swift编译优化那些事儿

2,261 阅读3分钟

场景:

今年初换了家公司,Swift项目,一次全量编译时间在222s+,调试增量编译时间在85s-110s左右,哪怕你在UI阶段,修改了A.swift类中某个View的背景颜色,同样需要85s-110s左右的时间才能看到效果,这无疑是对开发人员的一种折磨,也在很大程度上给开发很大挫折感,当然,最重要的是太影响效率了。所以抽空着手进行编译优化。把过程和方向分享给有需要的iOSer,也作为来掘金的第一篇输出

PS:经过以上优化,我们现在一次增量编译在15s左右,全量在140s左右,代码层面的优化还在进一步进行,最后全部完成后会更新下最终时间

一、 cocopod组件静态化

在这里推荐美柚团队开源的插件cocoapods-imy-bingithub地址,能大大减少构建时间,集成过程坑比较多,多在Issues区转转,后面抽空我会补充上来一波爬坑经验

二、Hmap

头文件映射,快速定位头文件,减少编译时间,github。它和cocoapods-imy-bin插件同样优化的是cocopod组件

三、Injection 工具

一个免费的简单的工具,属于iOSer的热重载,之前一直有用,很方便,很强大,能大大减少UI阶段调试时间。githubAppStore, 使用教程

四、代码优化

通过大量反复探索,swift代码书写方面会造成很大的编译问题,总原则为尽可能的明确到告诉编译起你想做什么,保持代码清晰明了,长期按照这个要求执行,不但能减少编译时间,而且能大大减少后期代码维护以及迭代,查找耗时代码并进行优化可以使用Build Time Analyzer工具来精准定位,进行优化

  1、尽量使用简单表达式
  2、尽量减少类型推导的使用
  3、尽可能少的使用懒加载
  4、避免数组,字符串等拼接时+ 操作
  5、可选值在表达式的正确使用
      比如:let str :String? = nil
           lab.text = str ?? "test"
      会比第二种写法耗时
           let str :String? = nil
           let aStr = str ?? ""
           lab.text = aStr
           
           

五、 开发工具设置的优化

1、取消Find Implicit Dependencies
    设置:Product > Scheme > Edit Scheme > Build
    取消隐式依赖的编译,如果framworks文件做了修改,需要勾选编译一次后才取消,让framworks文件生效
2、修改Debug Information Format(新版本Xcode中的已做了默认设置)
    设置:Build Settings-Debug Information Format-Debug改为DWARF
3、修改 Build Active Architecture Only(新版本Xcode中的已做了默认设置)
    设置:Build Settings-Build Active Architecture Only-Debug 改为YES
    

六、硬件设置

 1、增加编译线程
     
    1.获取当前内核数:
    sysctl -n hw.ncpu
    2.设置编译线程数:默认是cpu核数相同,一般设置为核数2倍效果比较好(个人测试2倍效果好,可以自己测试效果)
    defaults write com.apple.dt.Xcode IDEBuildOperationMaxNumberOfConcurrentCompileTasks 16
    3.获取编译线程数:
    defaults read com.apple.dt.Xcode IDEBuildOperationMaxNumberOfConcurrentCompileTasks
    4.Xcode显示编译时长:
    defaults write com.apple.dt.Xcode ShowBuildOperationDuration YES//设置后重启Xcode
    
  2、Xcode设置专属内存盘(如果是全固态硬盘,设置意义不大)
      1、创建ramdisk.sh文件 ramdisk.sh:https://www.aliyundrive.com/s/KXbGiQE4cMp 下载后去掉多余的后缀名
      2、执行ramdisk.sh文件
          sh ramdisk.sh 16 RamDisk  //16是专属盘的大小,RamDisk盘名称
      3、设置Xcode

image.png

以上作为几个优化方向,具体细节抽时间一一补充