美文网首页
XCode编译速度的提升

XCode编译速度的提升

作者: forever_sun | 来源:发表于2018-08-10 12:42 被阅读54次

首先感谢原文作者 https://medium.com/swift-programming/speeding-up-slow-swift-build-times-922feeba5780,其次,本文并非简单翻译或copy,而是在原有文章中补充了自己的经验。

swift 项目在开发一段时间后编译会变慢,根本原因是:1. 结果类型的推断。2.只要修改我们项目里的一个文件, 想要编译 debug 一下, 就又得重新合并文件从头开始编译一次, 而不能读取缓存跳过没有被修改的文件(Uber的开发团队偶然发现如果把所有Model文件全部合并到一个文件去编译,那编译时间会从1min35s减少到17s。当然,他们没有这么做,我们也不会这么做)。

所以,重点讲讲如何优化编译时间。

第一部分:如何查找项目中耗时代码在哪里(作者已知的方法有三个,没时间的直接看方法3)

方法1: 命令,首先cd到项目根目录

xcodebuild -workspace 项目名.xcworkspace -scheme 项目名 clean build OTHER_SWIFT_FLAGS="-Xfrontend -debug-time-function-bodies"

一段时间后,你会看到,哪个文件第几行的耗时

方法2: 在build setting中,设置Other Swift Flags为-Xfrontend -debug-time-function-bodies。这样编译时清楚的看到每个函数的编译时间,找到耗时较多的地方。

点击右边的展开按钮,可详细查看时间。

方法3:使用 BuildTimeAnalyzer(拆包装后请参照说明使用,谢谢😂),这个工具将给你极致体验,会给你把时间按倒叙排列,这样方便你优先解决的耗时(另:这个工具我不知怎么放到简书里给观众下载,亲可访问我的github账号sunhua163,随机给5个Project star然后截图微信我 😂 wx: forever_sunhua),这样就可以方便的获取到哪个文件的哪个方法耗时多少了

问:多长时间作为可参考的优化边界线?答:100ms!!!此时如果你按照我方法三做了操作,此时的你有没有惊呆😂!!!原来这么多需要优化的地方

第二部分:哪些操作会导致耗时?

1. 类型最好指定

let myCompany = [ "employees": [ "employee 1": ["attribute": "value"], "employee 2": ["attribute": "value"], "employee 3": ["attribute": "value"], "employee 4": ["attribute": "value"], "employee 5": ["attribute": "value"], "employee 6": ["attribute": "value"], "employee 7": ["attribute": "value"], "employee 8": ["attribute": "value"], "employee 9": ["attribute": "value"], "employee 10": ["attribute": "value"], "employee 11": ["attribute": "value"], "employee 12": ["attribute": "value"], "employee 13": ["attribute": "value"], "employee 14": ["attribute": "value"], "employee 15": ["attribute": "value"], "employee 16": ["attribute": "value"], "employee 17": ["attribute": "value"], "employee 18": ["attribute": "value"], "employee 19": ["attribute": "value"], "employee 20": ["attribute": "value"], ]]

以上测试代码最好将类型声明,let myCompany: Dictionary<String, AnyObject> = ...消耗的时间立马降到十几ms

2. 将nil判断写成if let方式解包。

3.将array+[data],变成array.append(data)

4.请将 a > b ? a : b 改为if else

5.CGFloat-->CGFloat类型转换(不止CGFloat,abs等也会导致)

6.Round()

7.系统提供链式语法最好拆开写,如下图

注释部分原先编译需要10秒+

8.lazy属性

private lazy var label: UILabel = { 

let l = UILabel() 

l.font = UIFont.systemFontOfSize(19) 

return 

}() 

private lazy var labe1: UILabel = { 

$0.font = UIFont.systemFontOfSize(19) 

return $0 

}(UILabel()) 

private var label2: UILabel! 

self.label2 = UILabel() 

self.label2.font = UIFont.systemFontOfSize(19) 

之前在解决编译慢时 完全没想到 lazy属性 会有影响,编译时间多大200ms+, 如果仅被编译一次,那就无关痛痒当一个类使用的地方多的时候,这个累会多次进行编译,假如一个类在10处有使用,则该类会被编译20次

9.给没有被继承的类, 没有被继承的方法加上 final 标签, 给编译器提供更多信息, 以便这些方法被优化为静态调用或者是内联进去 这些优化会对于程序的效率有很大的提升

最后:老衲写了这么久,施主github给个star再走呗😂 https://github.com/sunhua163

相关文章

网友评论

      本文标题:XCode编译速度的提升

      本文链接:https://www.haomeiwen.com/subject/pmceuftx.html