如下泛型函數(shù):
func min<T: Comparable>(x: T, y: T) -> T {
return y < x ? y : x
}
編譯器會插入如下代碼來支持泛型:
func min<T: Comparable>(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循環(huán)內(nèi)執(zhí)行泛型函數(shù)冒萄。
但是編譯器會根據(jù)上下文信息進(jìn)行優(yōu)化幻梯,對泛型函數(shù)進(jìn)行特化单绑,如下:
func foo() {
let x :Int = …
let y: Int = …
let r = min(x, y)
}
在這個函數(shù)內(nèi),其實(shí)編譯器可以通過上下文信息知道x,y的類型從而進(jìn)行編譯優(yōu)化:
func min<Int>(x: Int, y: Int) -> Int {
return y < x ? y : x
}
這樣就減少了大部分的泛型調(diào)用開銷。
但是由于編譯器的局限性彭雾,如果函數(shù)foo() 和 min(x,y)分別定義在不同的文件內(nèi),而編譯器是并行分析編譯文件串稀,從而min(x,y)在編譯的時候并沒有相關(guān)的上下文信息除抛,只能用完整的泛型調(diào)用來編譯。
不過母截,新版本的Xcode支持了一個新的功能Whole Module Optimization到忽,就是編譯器會將同一個Module內(nèi)的代碼都作為編譯上下文來實(shí)現(xiàn)編譯優(yōu)化,這樣只要foo和min兩個函數(shù)在同一個module內(nèi)微酬,就可以實(shí)現(xiàn)泛型特化的優(yōu)化而提高代碼的效率绘趋。這個選項(xiàng)可以在Xcode->target-> build settings -> Swift compiler -> Optimization Level中選擇 Whole Module Optimization 來達(dá)到優(yōu)化目的。