繁体   English   中英

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

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

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

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

该应用程序使用大量 SIMD 操作( float4float3float4x4等)并使用指针(例如UnsafeMutablePointer<float4> )。 我发现 Xcode 11 向我展示了像float4这样的 simd 类型现在已被弃用,并且类型typealiastypealias为新的SIMD结构。

关于从 iOS 12 移植到 iOS 13,我应该了解一些明显的信息吗? SIMD 类型的这种变化会成为性能下降如此可怕的根源吗? 如何恢复原始速度(iOS 13 似乎降级了)?

我的钱在 Xcode 11 上。Apple 可能以某种方式更改了编译器或编译器设置,从而影响了矩阵数学指令的生成。

Apple 的 Xcode 主要版本有时肯定会破坏一些东西,他们可能需要一段时间才能解决。

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

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

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

性能与 Swift 的 SIMD 实现的变化相关。 在 Xcode 10.1 及更早版本中,Swift 使用内置的 SIMD 数据类型。 使用 Xcode 10.2(和更新版本),Apple 为 SIMD 数据类型(例如float3SIMD4<Float>类型float3 )和操作添加了无用的面向对象的包装器,甚至没有费心测试性能,这使我的代码超过20 倍慢

有时您只需要速度,不要强迫面向协议的设计不属于它。

无论您选择在 Xcode 10.2 和更新版本中使用 Swift 4 还是针对 iOS 12,您仍然会获得相同的、糟糕的 SIMD 性能。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM