标记Swift类的最终版本是否也会使所有包含的变量,let和函数自动获得静态调度权益?

问题描述 投票:2回答:1

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

我是否还需要在我的班级最终标记每个var,let和func,或者仅仅标记托管类最终,以便它下面的所有东西都能利用直接方法调度?

换句话说:在每个方法和变量之前粘贴最终到处都是非常繁琐的。所以我希望只是将它放在类本身上就可以强制直接派遣所有类成员。但我不知道如何测试或验证它。

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

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

最后

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

swift performance final dispatch method-dispatch
1个回答
3
投票

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

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

我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源。然而,我们不应该放弃那个关键的3%的机会。

我很好奇你是否真的做了足够的分析来证实你已经达到了3%。如果你有,我道歉指出明显的;只是我没有看到任何上面的内容,以表明你如何确定静态调度会产生真正的影响。如果你有性能问题,通常会通过并使一切final不太可能成为解决问题的灵丹妙药。


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

© www.soinside.com 2019 - 2024. All rights reserved.