标记 Swift class final 是否也会使所有包含的 var、let 和函数自动获得 Static Dispatch 的好处?
Does marking a Swift class final also make all contained vars, lets and functions gain Static Dispatch benefits automatically?
我正试图从我的应用程序中榨取最后一点性能。我尽量在 classes 上使用 Structs(无状态共享,默认情况下直接分派等)。但是我的视图控制器和 UIView 对象显然仍然是 classes。出于性能原因,我想对我的每个方法和数据成员强制 直接分派 。
我还需要在 var、let 和 func =39=] final,还是仅将托管标记为 class final 就足够了,以便它下面的所有内容都可以利用 直接方法分派?
换句话说:在每个方法和变量之前都粘贴 final 非常繁琐。所以我希望将它放在 class 本身上具有强制直接调度所有 class 成员的相同效果。但我不知道如何测试或验证它。
对于那些想知道我在说什么的人,请查看这篇文章:"Method Dispatch in Swift"。结构和协议扩展默认为您提供静态方法调度(最快的性能),但 classes 没有。 classes 中的静态方法可以,但我想对所有实例方法和数据成员强制执行静态调度。
https://www.raizlabs.com/dev/2016/12/swift-method-dispatch/
swift 语言运行时文档提到了对子class 能力的影响,但没有描述 classes 的子成员和函数的调度行为会发生什么标记为 "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 委托方法等),它总是会被动态调度。它实际上只是 material 用于您自己的计算密集型代码,即便如此,仍然存在一个问题,即这是否是关键问题或是否存在其他问题(例如,在数组而不是字典中查找,复杂例程的并行化,使用某些任务的 Accelerate 或 Metal,打开优化发布构建等)。
但是如果您在不经常调用的代码上转换为静态分派,差异可能是 modest/unobservable。
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% 中。如果你有,我很抱歉指出了显而易见的事情;只是我没有看到上面的任何内容表明您如何确定静态分派会产生真正的影响。如果您遇到性能问题,通常通过并完成所有操作 final
不太可能成为解决问题的灵丹妙药。
我建议您观看 WWDC 视频,其中概述了识别和解决实际性能问题的方法:
- WWDC 2018 Practical Approaches to Great App Performance
- WWDC 2012 iOS App Performance: Responsiveness 是旧的,但它介绍了以下基本方法:
- 重现性能问题
- 配置文件
- 形成假设
- 做出改变
- 并重复。
我正试图从我的应用程序中榨取最后一点性能。我尽量在 classes 上使用 Structs(无状态共享,默认情况下直接分派等)。但是我的视图控制器和 UIView 对象显然仍然是 classes。出于性能原因,我想对我的每个方法和数据成员强制 直接分派 。
我还需要在 var、let 和 func =39=] final,还是仅将托管标记为 class final 就足够了,以便它下面的所有内容都可以利用 直接方法分派?
换句话说:在每个方法和变量之前都粘贴 final 非常繁琐。所以我希望将它放在 class 本身上具有强制直接调度所有 class 成员的相同效果。但我不知道如何测试或验证它。
对于那些想知道我在说什么的人,请查看这篇文章:"Method Dispatch in Swift"。结构和协议扩展默认为您提供静态方法调度(最快的性能),但 classes 没有。 classes 中的静态方法可以,但我想对所有实例方法和数据成员强制执行静态调度。
https://www.raizlabs.com/dev/2016/12/swift-method-dispatch/
swift 语言运行时文档提到了对子class 能力的影响,但没有描述 classes 的子成员和函数的调度行为会发生什么标记为 "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 委托方法等),它总是会被动态调度。它实际上只是 material 用于您自己的计算密集型代码,即便如此,仍然存在一个问题,即这是否是关键问题或是否存在其他问题(例如,在数组而不是字典中查找,复杂例程的并行化,使用某些任务的 Accelerate 或 Metal,打开优化发布构建等)。
但是如果您在不经常调用的代码上转换为静态分派,差异可能是 modest/unobservable。
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% 中。如果你有,我很抱歉指出了显而易见的事情;只是我没有看到上面的任何内容表明您如何确定静态分派会产生真正的影响。如果您遇到性能问题,通常通过并完成所有操作 final
不太可能成为解决问题的灵丹妙药。
我建议您观看 WWDC 视频,其中概述了识别和解决实际性能问题的方法:
- WWDC 2018 Practical Approaches to Great App Performance
- WWDC 2012 iOS App Performance: Responsiveness 是旧的,但它介绍了以下基本方法:
- 重现性能问题
- 配置文件
- 形成假设
- 做出改变
- 并重复。