开启Link Time Optimization(LTO)后到底有什么优化?

之前做build settings相关的调研,一直以为开启LTO后主要是能给包大小带来优化(在debug模式下包大小确实减小了5.7M),但是最终打包(release下)发现包大小不减反增了0.2M,于是仔细去查找了一下相关资料。

官方说得很清楚,开启LTO主要有这几点好处

(1)将一些函数內联化
(2)去除了一些无用代码
(3)对程序有全局的优化作用

所以对包大小造成影响的应该是前面两点。

什么是LTO?

image.png

LTO就是build settings中的一个编译选项,正如其名一样,Link Time Optimization,就是在链接的时候对程序进行了一些优化。我们具体来看看到底怎么优化的。

image.png

一个程序的运行过程如图,所有的文件编译成.o文件,然后所有的.o文件和一些需要的framewor再通过链接生成一个.app文件,也就是我们最后的可执行文件。

image.png

在开启LTO(Monolithic)后这些.o文件会附带一些优化信息,让它们在link的时候生成一个单一的整体的.o文件,再和需要的framework链接生成可执行文件。

苹果官方称他们已经在他们的应用软件中大量使用LTO,并且相比常规release模式在运行速度上提升了10%。此外它还会使用PGO(按配置优化)来优化代码,并且还能减小代码体积

Apple uses LTO extensively internally

  • Typically 10% faster than executables from regular Release builds Multiplies
  • with Profile Guided Optimization (PGO)
  • Reduces code size when optimizing for size

这里也带来了很明显的缺点,特别是在有debug info的时候,代码编译耗时和更大的内存占用且二次编译的时候得全部重新编译。

LTO trades compile time for runtime performance

  • Large memory requirements
  • Optimizations are not done in parallel
  • Incremental builds repeat all the work

于是苹果又做了一个优化,就是开启line-tables-only。官方描述如下

Debug Information Level [CLANG_DEBUG_INFORMATION_LEVEL]

Toggles the amount of debug information emitted when debug symbols are enabled. This can impact the size of the generated debug information, which can matter in some cases for large projects (such as when using LTO).

在开启line-tables-only后LTO内存占用提升百分之四十。

开启前
开启后

这就是LTO开启monolithic所进行的优化,所以苹果之前也是建议我们在开启LTO的同时开启line-tables-only。不过这还没完,后来苹果又有了一个新的技术,也就是LTO的incremental。

新的LTO主要又做了下面这几个改进

  • 分析和内联不合并对象文件
  • 提升编译速度
  • 二次编译有链接器缓存

下面看看开启incremental后的build过程:


image.png

这里主要过程是,在生成.o文件后,会产生一个analysis文件由于链接的优化,然后每个.o文件通过优化后生成一个新的.o文件,再与其它framework进行链接。这里通过LTO链接后会有一个link cache,当下次build的时候,如果没有修改,就不需要重新编译,所以二次编译就会很快,只需要编译和链接少数修改过的文件。

去年,苹果再次优化了incremental LTO,让link的时间有了更显著的提升,所以现在即使不开启line-tables-only也是可以开启LTO的了。

linkmap分析

由于在我们的项目中开启LTO后包大小反而增大,感觉这不太符合预期。于是查看了一下linkmap,发现TEXT、DATA、Symbols这些字段在开启LTO后确实都有减小,而Dead Stripped Symbols显示的符号大大的减少了。我猜测是因为我们项目中开启了符号剥离,在没有开启LTO的时候,符号剥离比较完全,而开启LTO后对符号剥离造成了影响,使符号剥离的数量大大减小,从而对包大小也带来了影响。

总结

开启LTO主要是对链接过程的一个优化,并且有link cache,使二次编译的速度更快,另一方面它还很有可能减小code size,在前面的linkmap分析中,确实基本可以保证开启LTO能对代码进行优化,但是由于对符号剥离的影响,具体是否能减小包大小还是得通过打包测试。这里我的建议还是在release模式下开启LTO。由于开启LTO后会对断点的单步执行有影响
image.png

所以debug模式下还是不建议开启。

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

推荐阅读更多精彩内容