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

时间:2019-03-22 22:28:10

标签: swift performance final dispatch method-dispatch

我正试图从我的应用程序中挤出所有最后的性能。我尝试在所有可能的类上使用Structs(不进行状态共享,默认情况下直接调度等)。但是我的视图控制器和UIView对象显然仍然是类。出于性能原因,我想对我的每个方法和数据成员强制直接调度

我是否仍需要标记班级最终中的每个 var let func ,还是是否足以将托管类标记为final,以便其下的所有内容都能利用直接方法分派

换句话说:将final粘贴到每个方法和变量之前非常繁琐。因此,我希望将其放在类本身上具有与强制所有类成员直接分派相同的效果。但是我不知道如何测试或验证它。

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

迅捷的语言运行时文档提到了对子类功能的影响,但没有描述子成员和标记为“最终”类的函数的分派行为所发生的情况。如果下面的所有内容都获得了“静态方法分派”,而不必单独标记所有最终结果,那将是很好的。

  

最终

     

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

1 个答案:

答案 0 :(得分:3)

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

但是,如果您要转换为不经常调用的代码的静态分派,则区别可能是适度的/不可观察的。

  

我们应该忘记效率低下的问题,例如大约97%的时间:过早的优化是万恶之源。但是,我们不应该放弃我们那关键的3%的机会。

我很好奇您是否已经进行了足够的分析以确认您在3%之内。如果可以的话,我很抱歉指出显而易见的事实;只是我没有在上方看到任何东西来表明您如何确定静态调度将产生真正的影响。如果您遇到性能问题,通常无法解决所有问题final就是解决问题的灵丹妙药。


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