Luk*_*cka 5 ios swift ios12 swift5 xcode10.2
我有一个非常奇怪的问题,似乎是由最新的Xcode 10.2编译引起的。
我注意到我的应用启动时间变得非常糟糕(慢了3倍),这仅是由于使用Xcode 10.2(.x)构建并在iOS 12.2上运行而引起的。当在较旧的iOS(12.0)上运行或使用针对iOS 12.2的Xcode 10.1编译时,相同的代码修订版可以正常运行。
延迟甚至发生在main()被调用之前。从根本上说Bootstrapping com.myapp.something with intent foreground-interactive,控制台说出与main()被叫之间的延迟是所测量的时间开始增加的地方。
应用设置(快速):
这是发生了什么
旧代码修订版(Swift 4.2)-较旧的版本之一,可以正常工作,然后使用Xcode 10.1进行编译
该表显示了使用Xcode 10.2进行编译对应用启动时间(开始出现状态栏的第一帧的那一刻)的影响。
| | iOS 12.0 | iOS 12.2 |
|------------|----------|----------|
| Xcode 10.1 | 1x | 1.25x |
| Xcode 10.2 | 1x | 3x | <--
Run Code Online (Sandbox Code Playgroud)
上次OK发行版(iOS 12.0 / Xcode 10.1)的启动时间被认为是1倍,其余时间是相对于它的。我们在这里谈论秒(减去3s->接近9s)。
仅在全新安装时才会发生此重大延迟。随后的每次启动都很快。
最新代码(Swift 5) -所有代码均已迁移到Swift 5,所有CocoaPods已更新为最新的Swift 5兼容版本,项目已更新为Xcode 10.2设置
与Swift 5之前的情况非常相似。因此,Swift 5本身似乎不是问题。
编辑1:
时间分析器发现初始化时间大大变慢了。
事实证明_dyld_start(动态框架的加载)慢了约35倍。
| | _dyld_start time |
|------------|------------------|
| Xcode 10.1 | 0.2s |
| Xcode 10.2 | 7.0s |
Run Code Online (Sandbox Code Playgroud)
这意味着与Xcode 10.2 + iOS 12.2有关的问题会导致动态框架的加载速度大大降低。
在将约35个动态框架(大多数是CocoaPods)加载到运行时的情况下,性能下降似乎很大。不知道为什么改变了...
由于此问题仅发生在iOS 12.2 + Xcode 10.2(已支持Swift 5)上,我想知道此问题是否可能与ABI稳定性有关。对我来说没有意义的是,即使在使用Xcode 10.2进行编译的Swift 5迁移之前的代码中,也会发生这种情况。
到目前为止我尝试过的是:
编辑2:
似乎是由动态链接器引起的。我们进行了一些调查,并发现在加载框架时,链接似乎在iOS 12.2上使用了不同的实现。
从iOS 12.2开始,在载入(中的ImageLoader::)时,在Instruments中有很多“递归” 的提法,看来递归在那儿出错了。堆栈跟踪似乎非常错误(请参见下面的屏幕截图)。
我猜这里唯一的解决方法是删除框架并直接编译或使用静态库。
任何有关如何继续使用框架的帮助/想法都值得赞赏!谢谢!
编辑3:
在第一个iOS 13 Public beta上似乎不再发生此问题。
测量(下面的设置)告诉我,在iOS 12.3.1上启动相同的代码修订所需的时间是在iOS 13上的大约三倍。
在我看来,这确实是iOS 12.x上的错误。鉴于iOS 13即将发布的事实,我认为iOS 12.x不会再有任何修复(导致诸如iPhone 6之类的设备掉落……)。
测试设置:
| 归档时间: |
|
| 查看次数: |
288 次 |
| 最近记录: |