关于Swift构建时间优化
在我上周阅读@nickoneill的出色文章《加快Swift的缓慢构建时间》之后,很难不以稍微不同的角度来看待Swift代码。
现在,只有一行可以被视为干净的代码提出了一个新问题-是否应将其重构为9行以使编译器满意? ( 请参见下面的nil合并运算符示例 )更重要的是什么? 简洁的代码还是编译器友好的代码? 好吧,这取决于项目规模和开发人员的挫败感。
但是等等……有一个Xcode插件
在介绍一些示例之前,让我首先提到手动检查日志文件非常耗时。 有人想出了一个终端命令来简化它,但我更进一步,将Xcode插件组合在一起。
以我为例,最初的目的只是确定并修复最耗时的区域,但我现在认为它必须更多地是一个迭代过程。 这样,除了使代码更有效地构建之外,我还可以防止耗时的函数首先进入项目。
惊喜不止
我经常在Git的各个分支之间来回跳动,而等待一个缓慢的项目来编译往往会浪费大量时间。 我一直想知道为什么我的一个宠物项目(大约2万行Swift代码)的构建速度如此之慢。
在了解了真正的原因之后,我必须承认我真的很惊讶看到单行代码需要几秒钟的编译时间。
让我们看几个例子。
无合并运算符
编译器当然不喜欢这里的第一种方法。 展开两个视图后,构建时间减少了99.4% 。
ArrayOfStuff + [Stuff]
这是这样的:
返回ArrayOfStuff + [Stuff]
// 而不是
ArrayOfStuff.append(stuff)
返回ArrayOfStuff
我经常这样做,并且每次都会影响所需的构建时间。 以下是最糟糕的情况,此处的构建时间减少了97.9% 。
三元运算符
通过用if else语句代替三元运算符,构建时间减少了92.9% 。 如果将地图替换为for循环,它将另外下降75%(但是我的眼睛会受伤)。 😉
将CGFloat转换为CGFloat
不知道我在想什么。 这些值已经是CGFloat,并且某些括号是多余的。 清理混乱之后,构建时间减少了99.9% 。
回合()
这真是奇怪。 以下示例变量是局部变量和实例变量的混合。 问题可能不是舍入本身,而是方法中的代码组合。 但是,除去舍入后的结果相差很大,准确的说是97.6% 。
//建立时间:1433.7ms
设展开= a — b — c +回合(d * 0.66)+ e
//建立时间:34.7ms
让扩展= a — b — c + d * 0.66 + e
注意:所有措施都是在MacBook Air(13英寸,2013年中)上进行的。
试试看
不管您是否有构建速度慢的问题,建立对什么会使编译器感到困惑的理解仍然很有用。 我相信您会发现自己有一些惊喜。 作为参考,这是需要5秒钟以上才能在我的项目中编译的完整代码。
更新:我已经写了这篇文章的第二部分,您可以在这里找到。
- UIScrollView里面的UIVIew弹回
- 如何编写踢屁股拉请求
- 我如何使用UISearchController在UISearchBar在我的导航栏,并具有范围button的iOS 8?
- 如何从iPhonevideo录制实时捕捉逐帧图像
- 如何知道UITextView何时成为第一响应者
- FPPopover不会popupbutton按下,只是NSLogs“FPPopoverController dealloc”
- 如何调整OpenEars错误识别
- Swift 2 – 过滤string数组,包括“like”条件
- iOS:播放需要validation的video在QuickLook中播放,但不在MPMoviePlayerViewController中播放