1、slowpath
与fastpath
在源码分析过程中,多次遇到过slowpath
与fastpath
的分支判断情形,最初简单以为是编译器优化选项Build Settings——Code Generation——Optimization Level
设置为Fastest,Smallest
导致的,而且以为设置为Fastest,Smallest
后就只会走fastpath
。
后来,仔细分析了slowpath
与fastpath
的源码:
#define fastpath(x) (__builtin_expect(bool(x), 1))
#define slowpath(x) (__builtin_expect(bool(x), 0))
发现就是一个比较,意思是x=1
和x=0
的几率很高,属于优化代码语句:
例如:
//lookUpImpOrForward方法
if (slowpath(behavior & LOOKUP_RESOLVER)) {
behavior ^= LOOKUP_RESOLVER;
return resolveMethod_locked(inst, sel, cls, behavior);
}
这个判断就是旨在behavior & LOOKUP_RESOLVER
等于0
的概率十分大,走return
几率极高。
之所以反思这个slowpath
与fastpath
,就是在断点分析lookUpImpOrForward
方法中这段代码时,明明debug
已经设置为Fastest,Smallest
,在慢查找
流程中搜索不存在的方法时,居然仍进入了if
中的return
语句,这样就反证了之前设置为Fastest,Smallest
就只走fastpath
的假设,所以导致以上反思。
所以后续代码分析不能跳过slowpath
与fastpath
的代码,必须都分析到。
网友评论