Swift编译器优化(1)泛型特化

如下泛型函数:
func min(x: T, y: T) -> T {
return y < x ? y : x
}

编译器会插入如下代码来支持泛型:
func min(x: T, y: T, FTable: FunctionTable) -> T {
let xCopy = FTable.copy(x)
let yCopy = FTable.copy(y)
let m = FTable.lessThan(yCopy, xCopy) ? y : x
FTable.release(x)
FTable.release(y)
return m
}

这样会增加很多的开销,特别是在大量操作的情况下,比如在for循环内执行泛型函数。
但是编译器会根据上下文信息进行优化,对泛型函数进行特化,如下:
func foo() {
let x :Int = …
let y: Int = …
let r = min(x, y)
}
在这个函数内,其实编译器可以通过上下文信息知道x,y的类型从而进行编译优化:
func min(x: Int, y: Int) -> Int {
return y < x ? y : x
}
这样就减少了大部分的泛型调用开销。
但是由于编译器的局限性,如果函数foo() 和 min(x,y)分别定义在不同的文件内,而编译器是并行分析编译文件,从而min(x,y)在编译的时候并没有相关的上下文信息,只能用完整的泛型调用来编译。
不过,新版本的Xcode支持了一个新的功能Whole Module Optimization,就是编译器会将同一个Module内的代码都作为编译上下文来实现编译优化,这样只要foo和min两个函数在同一个module内,就可以实现泛型特化的优化而提高代码的效率。这个选项可以在Xcode->target-> build settings -> Swift compiler -> Optimization Level中选择 Whole Module Optimization 来达到优化目的。

你可能感兴趣的:(Swift编译器优化(1)泛型特化)