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

如下泛型函数:
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循环内执行泛型函数。
但是编译器会根据上下文信息进行优化,对泛型函数进行特化,如下:
func foo() {
let x :Int = …
let y: Int = …
let r = min(x, y)
}
在这个函数内,其实编译器可以通过上下文信息知道x,y的类型从而进行编译优化:
func min<Int>(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 来达到优化目的。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • SwiftDay011.MySwiftimport UIKitprintln("Hello Swift!")var...
    smile丽语阅读 3,881评论 0 6
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 4,014评论 1 10
  • 泛型编码的目的 表达算法或者数据结构所要求的核心接口。(核心接口是什么呢?也就是找到想要实现的功能的最小需求。) ...
    请叫我小陈陈阅读 1,188评论 9 8
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 14,037评论 0 38
  • 1,从本篇文章/音频/视频中我学到的最重要的概念 成功不要迷失自己呀 不忘初心 2,我在本片文章/音频/视频中学到...
    沐汐蓓阅读 310评论 2 1