swift - 将 Swift 类标记为 final 是否也会使所有包含的 var、let 和函数自动获得 Static Dispatch 的好处?

标签 swift performance final dispatch method-dispatch

我正试图从我的应用程序中榨取最后一点性能。我尝试尽可能在类上使用 Structs(没有状态共享,默认情况下直接分派(dispatch)等等)。但是我的 View Controller 和 UIView 对象显然仍然是类。出于性能原因,我想对我的每一个方法和数据成员强制执行直接调度

我是否还需要在我的类(class)中标记每个 varletfunc final,或者是是否足以将托管类标记为最终类,以便其下的所有内容都可以利用直接方法分派(dispatch)

换句话说:在每个方法和变量之前都粘贴 final 非常乏味。所以我希望将它放在类(class)本身上具有强制直接 dispatch 所有类(class)成员的相同效果。但我不知道如何测试或验证它。

对于那些想知道我在说什么的人,请查看这篇文章:“Swift 中的方法调度”。结构和协议(protocol)扩展默认为您提供静态方法调度(最快的性能),但类没有。类中的静态方法可以,但我想对所有实例方法和数据成员强制执行静态调度。
https://www.raizlabs.com/dev/2016/12/swift-method-dispatch/

swift 语言运行时文档提到了对子类化能力的影响,但没有描述标记为“final”的类的子成员和函数的调度行为会发生什么。如果下面的所有内容都获得 Static Method Dispatch 而无需单独标记所有内容,那就太好了。

final

Apply this modifier to a class or to a property, method, or subscript member of a class. It’s applied to a class to indicate that the class can’t be subclassed. It’s applied to a property, method, or subscript of a class to indicate that a class member can’t be overridden in any subclass. For an example of how to use the final attribute, see Preventing Overrides.

最佳答案

是的,只需将类型标记为final,它的属性和方法也是final。但如果这是 UIKit 代码(方法重写、UIKit 委托(delegate)方法等),它总是会被动态调度。它实际上仅适用于您自己的计算密集型代码,即便如此,仍然存在一个问题,即这是否是关键问题或是否存在其他问题(例如,在数组而不是字典中查找、复杂例程的并行化、加速或金属的使用某些任务,打开优化发布构建等)。

但是,如果您在不经常调用的代码上转换为静态分派(dispatch),则差异可能不大/不可观察。

We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%.

我很好奇您是否真的进行了足够的分析以确认您属于那 3%。如果你有,我很抱歉指出了显而易见的事情;只是我没有看到上面的任何内容表明您如何确定静态分派(dispatch)会产生真正的影响。如果您遇到性能问题,通常将所有内容都检查final 不太可能成为解决问题的 Elixir 。


我建议您观看 WWDC 视频,其中概述了识别和解决实际性能问题的方法:

关于swift - 将 Swift 类标记为 final 是否也会使所有包含的 var、let 和函数自动获得 Static Dispatch 的好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55308577/

相关文章:

ios - 如何在 UITableViewController 中隐藏键盘?

swift - Xcode SDK 版本问题

c++ - 绘图功能的表现

JavaFX 与较大的 Canvas 尺寸存在巨大的滞后

java - lambda 性能的差异?

Java - 'synchronized' 和 'final' 方法,声明顺序

swift - MCSessionState 从连接状态变为未连接状态

ios - XCode 11.3、装有 iOS 13.2.2 的模拟器 iPhone X 和装有 watchOS 4.2 的 Apple Watch 42mm 时崩溃

java - 无法在 Java 中为 "final"变量赋值

java - 为什么在向按钮添加 ActionListener 时突然需要将变量声明为 "final"?