iOS独立开发|Swift项目编译时间的分析与优化

2,475 阅读4分钟

前言

本文将从代码层面探究如何分析并优化 Swift 代码的编译速度。这里就拿我个人项目(小白鼠)梦见账本来进行一次优化吧。

更多iOS独立开发相关文章欢迎移步专栏「Lawliet的独立开发碎碎念」

我的个人项目扫雷Elic 无尽天梯梦见账本隐私访问记录
类型游戏财务工具
AppStoreElicUmemi隐私访问记录

一、 通过超时警告分析代码中的编译瓶颈

1.1 项目配置

通过警告的形式标识出超出设定值的代码,下面以设置 100ms 为界限为例

BuildSettingsother swift flags 下添加下面的配置:

23-01.png

  • -Xfrontend -warn-long-function-bodies=100
  • -Xfrontend -warn-long-expression-type-checking=100

仅在 DEBUG 下添加就行了,毕竟只是用来检测

1.2 编译检查

Clean 后编译一次,这里就可以看到很多的警告了:

23-02.png

23-03.png

你可能觉得这样检测有点不方便,毕竟项目的警告可能有几百上千个。下面介绍一个工具:BuildTimeAnalyzer-for-Xcode

二、 BuildTimeAnalyzer-for-Xcode 使用说明

首先 Clone 项目代码(或者直接下载代码

git clone https://github.com/RyukieSama/BuildTimeAnalyzer-for-Xcode.git

这里我对使用步骤用中文详细进行了说明,并编译了成品App,如果你觉得不错,欢迎留下一颗小⭐️~

2.1 项目配置

BuildSettingsother swift flags 下添加下面的配置:

  • -Xfrontend -debug-time-function-bodies

然后 Clean 项目,重新 Build

2.2 打开 BuildTimeAnalyzer.xcodeproj

这里有三种方式来使用

a. 直接运行

23-04.png

b. 导出App

Product - Archive

23-05.png

导出一个App文件,以后即可直接使用了。

23-06.png

c. 懒人方式-下载即用

这里我搞好了一个包,直接可用。支持 IntelApple Silicon

下载:BuildTimeAnalyzer.zip即可

2.3 查看编译耗时日志

23-07.png

在列表中点击刚才自己的配置完成并编译后的项目,即可查看日志。

23-08.png

显示了整体编译耗时,还标有具体代码的行数与函数名,点击可跳转。

每次时间不一定一样,根据电脑运行情况会有一些变化,但是整体的瓶颈趋势还是基本一致的

三、 优化项目

这里个人建议结合上面两种方式来定位。

  • BuildTimeAnalyzer 用来找到瓶颈更加直观
  • 添加警告的方式用来定位具体代码更准确

3.1 项目配置

为了结合两种方式,这里我的配置如下:

23-09.png

BuildTimeAnalyzer 分析结果

电脑配置

23-12.png

  • 最高: DataBaseDataCenter+Overview 耗时 35075ms

案例1:较长的逻辑

23-10.png

这里是使用 WCDB 瓶颈显示的是连续的调用 WCDB 中的范型函数来获得一个 condition 进行数据库操作。

23-11.png

优化:拆分

23-14.png

Clean 后再 Build,查看是否有效:

23-15.png

DataBaseDataCenter+Overview 耗时由 35075ms 下降至 19007ms,减少了近一半的时间。那么再把 DataBaseDataCenter+Overview 其他相同场景的代码也优化一下看看结果吧。

23-16.png

优化了另一处一样的场景后,时间降到了 915ms

案例2:字符串拼接

这里使用了 + 进行字符串的拼接

23-19.png

23-17.png

此处总耗时 2596ms

优化:使用 "xx\(xx)xx" 拼接

使用 \(preString)~\(endString) 的方式进行拼接

23-20.png

23-18.png

效果明显,降到了 617ms

案例3:少用 ??

23-22.png

23-21.png

此处用了较多的 ??。整体耗时 3561ms

优化:提前 gurad/if let 解包或者减少调用 ?? 次数

23-23.png

23-24.png

整体降到了 855ms

四、 总结

此处列举了一些我在项目中的一些成功优化的点,当然还有一些没有找到合适优化方式的点。再有一些有价值的点结局的话我会再来更新进文中。

本次是以个人项目作为小白鼠进行的优化,企业项目中一般可优化的地方就更多了。但我们也不能为了优化而优化,不能影响了源代码的可读性与连贯性。

如果你有一些代码层面优化的经验的话,也欢迎大家交流补充~(联系方式在文章开头)

参考