iOS的fastpath和slowpath片解

1. 用到的软硬件

  • Macbook Air
  • macOS Mojave 10.14.6
  • Xcode 11.3.1
  • iPhone8手机一枚
  • Object-C(编程语言)

2. 新建一个工程

1.png

在我们的ViewController.m中键入如下代码


1.png

插入我们的苹果手机进行调试(我在虚拟机上也做过测试,发现虚拟机没有寄存器,所以难以调试),在我们的int a = -1处,打上一个断点,我们先测试一下正常情况下的判定(这里需要进行一个汇编调试设置)

2.png

随后点击运行


3.png

这可以看出这是一个很正常的赋值的过程。
现在我们注释掉这段正常模式下的代码,用我们的gcc模式代码来运行


4.png

从这个上面可以看出无伦你x是否大于0,它都先把y = 1的值赋上。然后在做判断。

3. 总结

__builtin_expect() 是 GCC (version >= 2.96)提供给程序员使用的,目的是将“分支转移”的信息提供给编译器,这样编译器可以对代码进行优化,以减少指令跳转带来的性能下降。
__builtin_expect((x),1)表示 x 的值为真的可能性更大;
__builtin_expect((x),0)表示 x 的值为假的可能性更大。
也就是说,使用likely(),执行 if 后面的语句的机会更大,使用 unlikely(),执行 else 后面的语句的机会更大。通过这种方式,编译器在编译过程中,会将可能性更大的代码紧跟着前面的代码,从而减少指令跳转带来的性能上的下降。

    //加入了gcc指令的判断下
    if(likely(x > 0))
        y = 1;
    else
        y = -1;

上面的代码中 gcc 编译的指令会预先读取 y = 1 这条指令,如果 x 的值在大部分情况下是小于 0 的,就应该用 likely(x < 0),这样编译出的指令是预先读取 y = -1 这条指令了。这样系统在运行时就会减少重新取值了

3. 参考

fastpath slowpath

你可能感兴趣的:(iOS的fastpath和slowpath片解)