Swift有多快以及为什么(第3部分)

在第1部分中,我们知道在一个非常简单的情况下,Swift可能比Objective C快9倍。这是一个巨大的改进。

在第2部分中,我们知道可以在编译时优化C函数。 编译器可以将某些函数调用替换为值。 C ++具有称为模板元编程的能力。 但是对于大多数实际使用案例,Swift的速度与C相当。

现在,该看看Swift在复杂情况下是否可以保持其速度。

在这里,我们有一个Swift类Calculator ,一些类都继承自它,并稍微改变了add行为。 我知道“慷慨”并不意味着给出夸大的加法结果。 但是我什至不会使用那些新类。 因此,不会造成任何伤害。

和往常一样,Swift选择内联这些函数(即使add函数也被标记为重写。)但是这一次,由于有4种不同的add函数,Swift需要每次都找到正确的代码块来运行。 红线描述了执行流程。

因此,对于每个循环,CPU需要执行比较分支分支,因此速度较慢。

在这种情况下,我们很幸运。 由于我们正在使用Calculator.add ,因此它是第一个。 调用SuperGenerousCalculator.add需要更长的时间来执行,结果数据显示出这一点。

我们可以确定要调用哪个函数,因为我们知道它是同一对象,因此应始终调用Calculator.add 。 无需每次检查。 但是,尽管功能强大,但是Swift编译器有其局限性。

有一个称为面向协议的编程的新工具。 它促进使用protocolstruct 。 这也使某些事情变得简单,并避免了与类相关的性能损失。