关于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秒钟以上才能在我的项目中编译的完整代码。

更新:我已经写了这篇文章的第二部分,您可以在这里找到。