什么原因,Swift应该比Objective-C快得多?

正如Craig在Swift宣布中所揭示的那样,据说它远远超过了Objective-C。

但我并不相信这种比较,因为正确实现的算法在C中应该是最快的,因为它可以由编译器高度优化,并且本质上是硬件友好的。 所以我猜想Swift可以获得的最佳性能,将是C中相同算法的性能。

由于C是Objective-C的一部分,为什么Objective-C和Swift性能之间存在很大的差距?

我能想象的唯一原因是Apple使用NSNumbers而不是C类型,但不应该是Obj-C的基础 – Swift比较,对吧?

这在很大程度上是猜测(虽然是知情的推测),但我的两大理论是:

1) 没有减少动态方法调度。 Objective-C中的每个方法调用都通过objc_msgSend 。 在最快的情况下,这可以快16指令,但它也可以慢很多。 Swift会在比Objective-C更少的情况下产生这种惩罚,例如:对swift-only协议方法的方法调用没有命中objc_msgSend ,但是如果协议是在Obj-C中声明的,或者swift协议是用@objc修饰的话。 @objc (这样它也可以被Objective-C对象采用),然后对swift对象采用的协议中的方法的方法调用似乎是通过objc_msgSend调度的。

2)避免堆分配。 在Objective-C中,(有效地)每个对象都是堆分配的。 使用静态类型系统,编译器可以更多地推断对象的生命周期并将其分配到堆栈上,除非它必须跨越Objective-C边界(或者太大而无法在堆栈上分配)。

我怀疑#2在这两者中要大得多,但两者都可能是重要的贡献者。 我相信它不仅仅是这个,但这些是两个非常可能的贡献者。