OC底层原理四: 编译器优化
2020-09-11 本文已影响0人
markhetao
问题
- 为什么苹果生产包会自动选择
Release环境?
1.认识slowpath 和 fastpath
objc4源码中有很多slowpath和fastpath函数,他们都是为编译优化而生。
image.png
宏定义如下:
#define fastpath(x) (__builtin_expect(bool(x), 1))
#define slowpath(x) (__builtin_expect(bool(x), 0))
2. 认识 __builtin_expect(EXP, N)
__builtin_expect是gcc引入的
-
作用: 允许
程序员将最有可能执行的分支告诉编译器。 -
函数:
__builtin_expect(EXP, N)表示 EXP==N的概率很大
3. slowpath 和 fastpath
-
fastpath:
定义__builtin_expect((x),1),表示 x 的值为真的可能性更大;即执行 if里面语句的机会更大 -
slowpath:
定义的__builtin_expect((x),0),表示 x 的值为假的可能性更大,即执行 else里面语句的机会更大
4. 如何配置
-
target->BuildSettings: 搜索:optimization。
我们发现Optimization Level中,Release环境下,已自动选择Fastest,Smallest[-OS]。 这就是我们问题的答案。 -
在开发过程中,想要提高编译速度,可将
Debug环境也选中Fastest,Smallest[-OS]模式。
image
在Fastest,Smallest[-OS]模式下,会发现汇编页面展示的代码已精简很多
答案
Release环境下,系统自动选择Fastest,Smallest[-OS]模式,完成编译器优化。
下一节: OC底层原理五:剖析isa (卸妆后的对象)