我正试图从我的应用程序中榨取最后一点性能。我尝试尽可能在类上使用 Structs(没有状态共享,默认情况下直接分派(dispatch)等等)。但是我的 View Controller 和 UIView 对象显然仍然是类。出于性能原因,我想对我的每一个方法和数据成员强制执行直接调度。
我是否还需要在我的类(class)中标记每个 var、let 和 func 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 视频,其中概述了识别和解决实际性能问题的方法:
- WWDC 2018 Practical Approaches to Great App Performance
- WWDC 2012 iOS App Performance: Responsiveness是旧的,但它介绍了以下基本方法:
- 重现性能问题
- 使用工具进行分析
- 形成假设
- 做出改变
- 并重复。
关于swift - 将 Swift 类标记为 final 是否也会使所有包含的 var、let 和函数自动获得 Static Dispatch 的好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55308577/