WWDC 2019 - What's new in Clang and LLVM

对 WWDC 2019 Session 409 的一些理解~

主要关注 session 中提到的这几点:

  • 新平台的支持
  • 底层代码大小优化
  • 语言层面的代码大小优化

新平台支持

Watch Series 4 的芯片是 64 位的,而 AppStore 之前所提供的 App 均是 32 位。但神奇的是所有的 App 却能继续运行,这其实是 Bitcode 的作用

什么是 bitcode

开启了 bitcode 的工程在编译过程会输出 source.bc 文件,当我们上传二进制包到 AppStore 时,会帮我们完成后续的编译动作,输出对应平台的二进制包

什么是 Bitcode

开发过 Apple Watch Apps 的同学应该知道,如果不勾选 bitcode 那是无法提交到 App Store 的,这也是为什么 64 bit 的 Series 4 能够支持 32 bit 的 Apps

底层代码大小优化

代码的大小会直接影响包大小,Xcode 11 增加了一个新的 optimization level -- -Oz

如何开启 -Oz

编译流程

了解 -Oz 如何做优化代码大小之前,我们先梳理一下整个编译流程:

编译流程

源代码 经过编译输出了 .IR 文件,接下来不是直接生成 .bc 文件而是先生成了 MIR 文件 (Machine IR)。LLVM 会在 .MIR上进行代码大小优化 -- Function Outlining

Function Outlining

这是在编译后期做的优化操作,它实际上跟语言本身无关,这里我们用汇编代码来做解释:


hassekakutani 拥有两段相同的代码片段,此时 LLVM 会把这些片段抽离成一个新的函数 -- OUTLINED_FUNCTION_0,接着将 OUTLINED_FUNCTION_0 替换到原来的代码处:

上面的例子会替换成一条单独的汇编调用指令 -- b OUTLINED_FUNCTION_0 ,这样的结果很明显,一下子减少了几行汇编代码,从而缩减了代码体积(是否也同时减少了设备耗电?)
苹果给出的预期优化收益是:
25%的大小优化!

同时像 ARM prologue 以及 epilogue 这类编译器产生的代码也会被 Function outlining 优化掉:

毫无疑问,这一系列的优化都是有代价的~

代码控制流变化

假设我们对以下 collatz 函数执行优化操作:

Screen Shot 2019-06-11 at 12.54.51 PM.png

此时整个代码控制流发生了改变:

如果此时 collatz 函数 crash 了,那么当前的 crash 堆栈会发生改变:

这相当于降低了代码的 可调试性

代码的执行时间增加

将许多代码片段抽离成单独函数,再执行调用,这一点毫无疑问增加了执行时间。
当我们添加了 -Oz 之后,编译器只会关心 代码大小 这一指标,而性能相关会被忽略。
对于 性能要求高的代码在使用 -Oz 前要三思 !!!
Xcode 目前提供了的几个优化 level 都有不同的考虑:

  • -O3 -O2 可以让代码的执行时间变少,但结果就是代码大小增加,典型的空间换时间。
  • -Oz -Os 则是牺牲时间,减少了代码大小

对于 Xcode 来说默认的优化等级是 -Os

使用

除了在 Xcode 中的 optimization level 中进行设置,我们还可以做更细颗粒度的操作:

更细颗粒度的优化操作

如何验证包大小改变

Mac 自带了一个查看二进制文件的命令行工具 size,它可以查看具体文件中 Mach-O 各个 Section 的大小:

语言层面的代码大小优化

除了底层代码,上层的代码也有大小相关的优化

合并 Objective-C 中冗余的 block 代码

假设有这样两段代码都调用了 fuseWithCallbackBlock: ,但是 block 内部的代码没有直接联系:

对于 block 内 capture 的内容,底层会生成一个 struct 来记录:


对应产生两个 struct

其中高亮部分则是系统优化的地方,copy_helper 以及 destroy_helper 这两个指针都被指向了系统创建的函数:

这样的优化结果是:

直接继承 NSObject 对象的 ivar 偏移量优化

Objective-C 中会有 ivar layout 的概念,比如存在一个 Card 类,它在内存中的 ivar layout 是这样的:

Screen Shot 2019-06-16 at 3.53.33 PM.png

而在编程领域中我们会提到一个叫 Fragile base class 的问题,当一个基类的成员变量被修改后,所有继承它的子类在没有重新编译之前都将无法使用,C++ 就存在这个问题
而对于 NSObject 来说,Apple 称它是属于 iOS 平台 ABI 的一部分,继承 NSObject 的基类只有在执行 init 方法时才会去获取整个类的 ivar layout,所以继承该基类的子类可以直接得到新的 layout,无需重新编译:

Screen Shot 2019-06-16 at 5.59.14 PM.png

针对直接继承 NSObject 的 ivar layout 可确定性,Xcode 11 针对 property 代码进行了以下优化:
Screen Shot 2019-06-16 at 6.02.10 PM.png

在 Xcode 11 之前,想要访问一个 property 需要先执行寻址,然后放入寄存器,最后访问;而现在对于直接继承 NSObject 的对象,直接通过一条 orr 直接就可以将结果写入目标寄存器,又节省了几行汇编代码,这一系列的操作带来的收益是:

Screen Shot 2019-06-16 at 6.07.02 PM.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352