什么原因,Swift 应该比 Objective-C 快那么多? [关闭]

Posted

技术标签:

【中文标题】什么原因,Swift 应该比 Objective-C 快那么多? [关闭]【英文标题】:Whats the cause, Swift is supposed to be that much faster than Objective-C? [closed] 【发布时间】:2014-06-03 15:35:27 【问题描述】:

正如 Craig 在 Swift 的公告中透露的那样,据说它目前比 Objective-C 快。

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

既然 C 是 Objective-C 的一部分,为什么 Objective-C 和 Swift 的性能差距那么大?

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

【问题讨论】:

见programmers.stackexchange.com/questions/242816/… 只是一个警告,类似的问题已经被问过几次并且被大量否决。不过这里有一个很好的讨论:programmers.stackexchange.com/questions/242816/… 你真的应该得到苹果现在在 iStore 上提供的免费 Swift 书。为两天前的语言寻找 Stack Overflow 专家似乎......过于乐观。另一方面,我确实发现 Apple 的“Objective C sux,试试 Swift”的立场很有趣。 是的,那本书是我的待办事项;)我只是想知道,如果 Swift 真的可以完全取代 Objective-C,因为它看起来像是各种脚本语言的混合体,比如 JS 等,对我来说。但我喜欢它似乎真的很快! 如果有一个主要是数字运算的比较,他们肯定会使用 Objective-C NS* 类型进行性能比较。也许这不公平,但这是一场营销谈话,NS* 类型的广泛使用 有点 证明了这一点。 【参考方案1】:

这主要是推测(尽管有根据的推测),但我的两大理论是:

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

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

我怀疑 #2 是这两者中更大的一个,但两者都可能是重要的贡献者。我敢肯定,它不仅仅是这个,但这是两个很可能的贡献者。

【讨论】:

我不确定 (1) 是否像您说的那样绝对。诚然,看起来他们已经进行了设置,以便调度通常是静态的,但例如协议作为正交特性延续到子类——我不明白它们是如何做到这一点的,尤其是在声称使用运行时,而不动态调度这些调用的情况下。当然,在这个阶段,我可能只是无法理解。 (另外,我的阅读是对象继续存在于堆上,但 structs 的新概念类似于 C# 而不是 C,引入了通用堆栈对象) 对 swift-only 协议的方法调用不会命中 objc_msgSend。如果协议是在 ObjC 中声明的,或者如果 swift 协议用@objc 装饰,那么对协议方法的方法调用是通过objc_msgSend 分派的,所以你说得对,它不像“没有动态方法分派”那么简单,但是有大幅减少动态调度...编辑的重要机会。 您显然比我有时间阅读的内容更多。谢谢你让我直截了当。 +1 等

以上是关于什么原因,Swift 应该比 Objective-C 快那么多? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 和 Objective-C 项目中使用 CocoaPods

使用Pods中使用Swift和Objective-C混编-编译不通过的原因

将 Objective-C 框架(CocoaPod)导入 Swift?

我应该知道今天使用 Swift 的 Objective-C [关闭]

网路文章翻译: 到底该学Swift还是Objective-C ? 简短的回答是: 都学

Swift学习: 从Objective-C到Swift