Fra*_*ock 3 performance final method-dispatch dispatch swift
我正在努力从我的应用程序中榨取最后一点性能。我尝试尽可能使用结构而不是类(无状态共享、默认直接调度等)。但我的视图控制器和 UIView 对象显然仍然是类。出于性能原因,我想强制直接调度我的每一个方法和数据成员。
\n\n我是否仍然需要在类中标记每个var、let和func为Final,还是只需将托管类标记为 Final 就足够了,以便其下面的所有内容都可以利用直接方法分派?
\n\n换句话说:在每个方法和变量之前粘贴 Final 是非常乏味的。所以我希望将它放在类本身上具有强制直接调度所有类成员的相同效果。但我不知道如何测试或验证它。
\n\n对于那些想知道我在说什么的人,请查看这篇文章:“Swift 中的方法调度”。默认情况下,结构和协议扩展为您提供静态方法分派(性能最快),但类则不然。类中的静态方法可以,但我想对所有实例方法和数据成员强制静态调度。
\n https://www.raizlabs.com/dev/2016/12/swift-method-dispatch/
swift 语言运行时文档提到了对子类化能力的影响,但没有描述标记为“final”的类的子成员和函数的分派行为会发生什么。如果下面的所有内容都获得静态方法调度而不必单独将所有内容标记为最终版本,那就太好了。
\n\n\n\n最终的
\n\n将此修饰符应用于类或类的属性、方法或下标成员。它应用于一个类以指示该类不能被子类化。它应用于类的属性、方法或下标,以指示类成员不能在任何子类中被覆盖。有关如何使用 Final 属性的示例,请参阅防止覆盖。
\n
是的,只需将类型标记为final,它的属性和方法final也是 。但如果这是 UIKit 代码(方法覆盖、UIKit 委托方法等),则 \xe2\x80\x99s 始终会动态分派。它\xe2\x80\x99s实际上只是你自己的计算密集型代码的材料,即使如此,\xe2\x80\x99s仍然存在一个问题,即\xe2\x80\x99s是否是关键问题或是否存在其他问题(例如,在数组而不是字典中查找、复杂例程的并行化、某些任务的 Accelerate 或 Metal 的使用、打开优化的发布版本等)。
但是,如果您将\xe2\x80\x99 不经常调用的代码转换为静态调度,则差异可能很小/不可观察。
\n\n\n\n\n我们应该忘记小效率,大约 97% 的情况下:过早的优化是万恶之源。然而,我们不应该放弃这关键的 3% 的机会。
\n
我\xe2\x80\x99m很好奇你\xe2\x80\x99是否真的做了足够的分析来确认你\xe2\x80\x99在那3%中。如果你有,我很抱歉指出了显而易见的事情;只是我没有看到上面的任何内容来表明您如何确定静态调度将产生真正的影响。如果您遇到性能问题,通常经历并完成所有事情final不太可能是解决问题的灵丹妙药。
I\xe2\x80\x99d 请您参阅 WWDC 视频,其中概述了识别和解决实际性能问题的方法:
\n\n| 归档时间: |
|
| 查看次数: |
786 次 |
| 最近记录: |