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的代码,必须都分析到。












网友评论