3

我试图从我的应用程序中挤出最后一点性能。我尽可能在类上使用结构(无状态共享、默认直接调度等)。但是我的视图控制器和 UIView 对象显然仍然是类。出于性能原因,我想对我的每一个方法和数据成员 强制直接调度。

我是否还需要在我的类final中标记每个varletfunc,或者仅仅标记托管类 final 就足够了,以便它下面的所有东西都可以利用直接方法调度

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

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

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

最终的

将此修饰符应用于类或类的属性、方法或下标成员。它应用于一个类以指示该类不能被子类化。它应用于类的属性、方法或下标,以指示不能在任何子类中覆盖类成员。有关如何使用 final 属性的示例,请参阅防止覆盖。

4

1 回答 1

4

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

但是,如果您在不经常调用的代码上转换为静态调度,则差异可能是适度/不可观察的。

我们应该忘记小的效率,比如大约 97% 的时间:过早优化是万恶之源。然而,我们不应该放弃那关键的 3% 的机会。

我很好奇你是否真的做了足够的分析来确认你属于那 3%。如果你有,我很抱歉指出了明显的;只是我没有在上面看到任何内容来表明您如何确定静态调度将产生真正的影响。如果您遇到性能问题,通常经历并完成所有事情final不太可能成为解决问题的灵丹妙药。


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

于 2019-03-23T00:03:14.407 回答