什么原因,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-CNS*
类型进行性能比较。也许这不公平,但这是一场营销谈话,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) 是否像您说的那样绝对。诚然,看起来他们已经进行了设置,以便调度通常是静态的,但例如协议作为正交特性延续到子类——我不明白它们是如何做到这一点的,尤其是在声称使用运行时,而不动态调度这些调用的情况下。当然,在这个阶段,我可能只是无法理解。 (另外,我的阅读是对象继续存在于堆上,但struct
s 的新概念类似于 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 [关闭]