Swift之通过减少动态派发来提升性能
Swift是OO(面向对象)的语言,所以少不了方法和属性的重载等特性,程序只能在运行时来确定具体的方法或属性来间接调用或间接访问,这就叫做动态派发。从性能上考虑,对于动态派发的方法,会有常量时间的运行时开销。接下来将介绍三种方法来移除这样的动态性,final
,private
,全模块优化(Whole Module Optimization),以此提升性能。
考虑下面的例子:
1 | class ParticleModel { |
如上述代码所示,调用过程为:
- 调用变量
p
的update
方法。 - 调用
p
的updatePoint
方法。 - 获取
p
的元组类型变量point
。 - 获取
p
的属性velocity。
由于ParticleModel
可以被子类,所以其方法和属性就能被重载,这就不可避免的需要使用动态调用。
在Swift中,动态调用是通过在一个方法表中找到方法然后执行间接的调用(类似于C++的虚函数表),对于这种先查找再调用的过程,其效率是要低于方法的直接调用,而且间接调用会阻止许多编译器优化,这将加重间接调用的开销。接下来将列举一些技巧来禁用动态派发的行为,以达到提升性能的目的。