一、两个疑惑
OC 和 Swift 语言在 Richards 上评测的结果显示,Swift 比 OC 快了4倍,Swift同OC相比会更快,具体应归结在那些因素上面?
通常一个 Swift 项目少则编译五六分钟,多则编译个半个小时也是不为过的事情,Swift 语言既然比 OC 速度快,但是为何实际开发中 Swift 编译却很慢?
二、全文思路介绍
通常一门语言的好坏,通常取决于下面三个因素:
内存分配:主要是指堆内存分配和栈内存分配。
引用计数:主要至于如何权衡引用计数。
方法调度: 主要在于静态调度和动态调度。
除了上面这三个因素之外,另外还有另个影响因素。首先是编译器的优化;其次是这门语言中的一些其他额外特性,如Swift语言中的对面向协议的额外处理。
所以在接下来的篇幅中,笔者将重点从编译器优化、内存分配优化、引用计数优化、方法调用优化以及面向协议编程的实现细节这五个方面来谈谈Swift语言的性能。
三、编译器优化分析
Whole Module Optimizations机制
不得不说编译内部有很多需要开发者需要掌握的技术点,笔者打算后期有时间针对编译相关的东西做一些整理,顺带介绍iOS中的LLVM编译器。如上图所示,这是Swift编译器中引入的Whole Module Optimizations优化机制。在没有这个机制之前,同绝大多数的编译器一样,编译器在编译过程中,会针对每一个源文件先是生成目标文件(.o 文件),然后连接器将不同的目标文件组合起来,最终生成可执行程序。
常规编译过程
试想整个项目中我们定义了这样一个函数
func max(x:T, y:T) -> T {
return y > x ? y : x
}
但是在实际的整个项目中,只有一处我们按照下面的形式使用到了上面这个max方法。
let x = 1
let y = 2
let r = max(x: x, y: y)
因为有了Whole Module Optimizations机制,编译器可以清楚的知道整个项目中只是用到了max函数的Int类型参数比较。所以在编译的过程中,编译器完全可以把max函数看做是一个只支持Int类型数值比较的方法,不用再编译成还需要支持其他类型参数比较的方法。Swift编译器类似的优化还有很多,Whole Module Optimizations为编译器提供了