美文网首页
编译器优化

编译器优化

作者: 镜像 | 来源:发表于2022-01-17 21:49 被阅读0次

首先我们先看以下代码:

image.png

编译器优化优化的是什么呢,优化的是底层代码执行逻辑,使项目执行更加高效。汇编是最接近底层的代码,所以我们从汇编来看编译器优化是如何优化的。
在15行打个断点,运行程序看到的汇编代码如下:

汇编

真机Debug模式运行下的汇编代码如上图,我们可以看到ab变量的赋值以及加法运算过程。
我们在Build Settings里面搜索optimization,可以看到优化等级,在Debug模式下是None也就是没有优化。release模式下是Fastest,Smallest,最小最快,一般情况我们就设置这个值即可。

Build Settings

我们把Debug模式下也改成Fastest,Smallest再运行项目,得到的汇编代码如下:

优化后的代码

可以看到,优化后代码比之前少了15行,速度更快。
代码里面没有了ab变量的赋值,直接把结果0x1e即30放到了w8寄存器上。

在读OC源码的时候,我们会看到大量的fastpath(x)slowpath(x),这些用到了编译器优化。
看下这两个宏定义的实现:

#define fastpath(x) (__builtin_expect(bool(x), 1))
#define slowpath(x) (__builtin_expect(bool(x), 0))

__builtin_expect这个指令是gcc引入的,作用是允许程序员将最有可能执行的分支告诉编译器。这个指令的写法为:__builtin_expect(EXP, N)。
意思是:EXP==N的概率很大。

首先我们需要明确:

if(fastpath(x))  等价于  if(x)
if(slowpath(x))  也等价于  if(x)

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

例如:

int x, y;
 if(slowpath(x > 0))
    y = 1; 
else 
    y = -1;

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

所以以后我们再看OC源码时候,slowpath可以不太用关注,因为这个大多是一些容错处理,这样可以提高我们源码阅读效率。

相关文章

  • LLVM

    一、编译器 性能优化:启动优化、界面优化、架构优化 编译型语言:OC(编译器是clang)、C(编译器可以直接执行...

  • Linux 下如何绕过编译器优化

    本文首次发表在 Linux 下如何绕过编译器优化 有同学在群里聊到编译器优化的事情,很多时候期望编译器默认做优化,...

  • JMM造成指令重排的原因

    1、编译器优化 2、Processor 优化(流水线) 3、MESI缓存优化

  • iOS逆向之OC反汇编(上)

    本文主要讲解编译器的优化以及指针的汇编 编译器优化 设置 可在项目的BuildSetting->Optimizat...

  • 内联函数(Inline Function)

    场景:如果开启了编译器优化(Release模式默认会开启优化),编译器自动将某些函数变成内联函数 调用方式如下: ...

  • 编译器优化部分代码

    我们简单写一些代码看编译器优化前后的对比。编译器没有优化时 在Build Setting 搜索optimizati...

  • iOS的性能优化

    1、ipa包体积优化 1.1 编译配置优化:编译器代码层面优化Optimize Level;Bitcode(较难...

  • @inline inout

    内联函数 如果开启了编译器优化(Release模式默认会开启优化),编译器会自动将某些函数变成内联函数.即将函数调...

  • 晚期(运行期)优化

    HotSpot的即时编译器 解释器与编译器 编译对象与触发条件 编译过程 编译优化技术 如果还对其他的经典编译优化...

  • JVM中锁的优化策略

    即时编译器优化技术有很多种,JVM一书中介绍了4种重要的优化技术。 下面我们来聊一聊关于即时编译器其余的优化技术之...

网友评论

      本文标题:编译器优化

      本文链接:https://www.haomeiwen.com/subject/cnchhrtx.html