Swift语法对编译速度的影响

Swift语法对编译速度的影响,第1张

概述使用Swift初期会惊艳于它强大的表达力,发现原来很啰嗦的逻辑可以用一两句话写完时,工具的强大导致自己会情不自禁的写一些“聪明”的代码。但是Swift毕竟是一个婴儿时期的语言,编译器对于这些极简的代码的处理能力是一个容易被忽略的副作用。 在混编Swift两年后,工程的编译速度到了忍无可忍的程度。通过网上搜寻“如何提高Xcode编译速度”把能做的优化都做了之后,还是没有得到根本的提升。直到发现了这篇

使用Swift初期会惊艳于它强大的表达力,发现原来很啰嗦的逻辑可以用一两句话写完时,工具的强大导致自己会情不自禁的写一些“聪明”的代码。但是Swift毕竟是一个婴儿时期的语言,编译器对于这些极简的代码的处理能力是一个容易被忽略的副作用。

在混编Swift两年后,工程的编译速度到了忍无可忍的程度。通过网上搜寻“如何提高Xcode编译速度”把能做的优化都做了之后,还是没有得到根本的提升。直到发现了这篇文章Regarding Swift build time optimizations,它采用了一个开源工具来检测每一个Swift方法的编译时间,从而定位耗时。我通过对耗时语法的修改,成功的把一个超过4年多庞大工程的编译速度缩短了30%。

下面介绍一下这次优化中遇到的有坑的语法:

1. 避免在Array/Dictionary literals里使用复杂运算,如 ?? (Nil Coalescing Operator),随元素个数耗时成指数式增长
var a: String?var b: String?var c: String?var d: String?var e: String?var f: String?var g: String?let _ = [    "a": a ?? "",// 1 ms    "b": b ?? "",// 3 ms    "c": c ?? "",// 11 ms    "d": d ?? "",// 48 ms    "e": e ?? "",// 274 ms    "f": f ?? "",// 1339 ms    "g": g ?? "",// 6550 ms]

解决方案:用传统的键值对赋值

var dict = [String: String]()dict["a"] = a ?? "" // 30 msdict["b"] = b ?? "" // 27 msdict["c"] = c ?? "" // 25 msdict["d"] = d ?? "" // 27 msdict["e"] = e ?? "" // 26 msdict["f"] = f ?? "" // 26 msdict["g"] = g ?? "" // 28 ms
2. 浮点数参与的数学函数后追加算数运算,耗时增长幅度匪夷所思
min(1,2.0)    + 1 // 10 ms    + 2 // 35 ms    + 3 // 352 ms    + 4 // 6092 ms

解决方案:数学函数独立运算,用结果做算数运算

let a = min(1,2.0)a + 1 + 2 + 3 + 4 // 11 ms
3. 避免在有??的情况下使用 + 来拼接字符串
var a: String?let _ = (a ?? "")    + "1" // 27 ms    + "2" // 101 ms    + "3" // 1043 ms    + "4" // 编译超时

解决方案:采用 \() (String Interpolation)

let _ = "\(a ?? "")1234" // 73 ms
另外介绍一个Hack的设置

在user-defined里添加SWIFT_WHolE_MODulE_OPTIMIZATION = YES 可以在deBUG选择Onone的前提下享受到优化

总结

以上是内存溢出为你收集整理的Swift语法对编译速度的影响全部内容,希望文章能够帮你解决Swift语法对编译速度的影响所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1056042.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-25
下一篇2022-05-25

发表评论

登录后才能评论

评论列表(0条)

    保存