iOS 使用 Xcode 11 构建应用程序后速度慢了 20 倍以上

iOS App is >20x slower after building with Xcode 11

我有一个为 iOS 12(Xcode 10,Swift 4.2)开发的应用程序(Xcode 项目),我现在想为它重建iOS 13 使用 Xcode 11.

当我在 Xcode 11 打开项目,构建并 运行 项目时,我发现我的应用程序突然慢了 20 多倍!我多次检查是否选择了发布配置,并且使用了与 Xcode 10 中相同的编译标志。不用说,编译器优化已达到极限,就像在 Xcode 10.[=20= 中一样]

该应用程序使用大量 SIMD 操作(float4float3float4x4 等)并使用指针(例如 UnsafeMutablePointer<float4>)。我发现 Xcode 11 向我展示了类似 float4 are now deprecated and typealiased to new SIMD 结构的 simd 类型。

关于从 iOS 12 移植到 iOS 13,有什么明显的我应该知道的吗? SIMD 类型的这种变化是否会导致如此可怕的性能下降?如何恢复原来的速度(iOS 13 好像降级了)?

我的钱在 Xcode 11. Apple 可能更改了编译器或编译器设置,影响了矩阵数学指令的生成。

Apple 的主要版本 Xcode 有时肯定会出现问题,他们可能需要一段时间才能解决问题。

尝试在使用 Xcode 11 的同时构建 iOS 12。然后采用相同的项目并从 Xcode 10.2.

构建它

我公司的应用程序非常庞大,在 Xcode11 下构建时间增加了 ≈3 倍。这非常痛苦。显然,这与执行速度是不同的问题,但它仍然告诉您我们对构建过程进行了重大更改。

在我将 SIMD-heavy Swift 代码库重写为 Objective-C 后,旧性能得以恢复。 Objective-C 值得庆幸的是,仍然使用没有无意义包装的良好旧 SIMD 数据类型。

性能与 Swift SIMD 实现的变化相关。在 Xcode 10.1 及更早版本中,Swift 使用内置 SIMD 数据类型。使用 Xcode 10.2(及更新版本),Apple 为 SIMD 数据类型添加了无用的 Object-Oriented wrapper(例如 float3SIMD4<Float> 的类型别名)和操作,甚至懒得去测试性能,这让我的代码慢了 20 倍

有时候你只是需要速度,不要强行在不属于它的地方进行面向协议的设计。

在 Xcode 10.2 和更新版本中,无论您选择使用 Swift 4 还是目标 iOS 12 都没有关系,您仍然会得到相同的、糟糕的 SIMD 性能.

TL;DR: Apple 搞砸了 pre-Swift-5 SIMD 性能水平 in Xcode 10.2 和更新。将您的 SIMD 密集型代码移植到 Objective-C 以获得良好的旧级别性能(在我的情况下快 20 倍)。希望 Apple 不会触及 Objective-C 否则我们很快就会在 Neon 汇编中编写以获得不错的性能...