美文网首页
使用likely和unlikely 优化程序性能

使用likely和unlikely 优化程序性能

作者: wywindz | 来源:发表于2018-11-14 09:32 被阅读0次

作用

likely unlikely是为编译器提供对分支优化的提示,基本用于if-else的分支优化场景。if-else在汇编时会将else分支的命令生成跳转语句(jmp),而跳转会影响程序性能,所以如果大部分情况下都是else分支成立的话,程序每次都会执行跳转,从而影响效率,使用likelyunlikely即可以告诉编译器大部分情况下哪个分支更有可能成立,从而将该分支的语句编译到前面,提高运行效率。

实现

likelyunlikely是通过宏定义实现的:

#define likely(x)   __builtin_expect(!!(x),1)
#define unlikely(x) __builtin_expect(!!(x),0)

GCC文档对__builtin_expect()的解释如下:

-- Built-in Function: long __builtin_expect (long EXP, long C)
     You may use `__builtin_expect' to provide the compiler with branch
     prediction information.  In general, you should prefer to use
     actual profile feedback for this (`-fprofile-arcs'), as
     programmers are notoriously bad at predicting how their programs
     actually perform.  However, there are applications in which this
     data is hard to collect.

     The return value is the value of EXP, which should be an integral
     expression.  The value of C must be a compile-time constant.  The
     semantics of the built-in are that it is expected that EXP == C.
     For example:

          if (__builtin_expect (x, 0))
            foo ();

     would indicate that we do not expect to call `foo', since we
     expect `x' to be zero.  Since you are limited to integral
     expressions for EXP, you should use constructions such as

          if (__builtin_expect (ptr != NULL, 1))
            error ();

     when testing pointer or floating-point values.

使用

举个栗子🌰

#define likely(x)    __builtin_expect(!!(x), 1)
#define unlikely(x)  __builtin_expect(!!(x), 0)

int main(char *argv[], int argc)
{
   int a;

   /* Get the value from somewhere GCC can't optimize */
   a = atoi (argv[1]);

   if (unlikely (a == 2)) //等同于if(a==2)
      a++;
   else
      a--;

   printf ("%d\n", a);

   return 0;
}

注意,编译时需要加 -O2选项
可以用objdump -S XXX 来查看汇编指令
使用unlikely()时,汇编指令为je(相等则跳转)
而使用likely()时,汇编指令为jne (不相等则跳转)

相关文章

  • 使用likely和unlikely 优化程序性能

    作用 likely unlikely是为编译器提供对分支优化的提示,基本用于if-else的分支优化场景。if-e...

  • likely() and unlikely()

    In Linux kernel code, we often find some calls to likely...

  • likely()&unlikely()

    一般的使用方法是将__builtin_expect指令封装为likely和unlikely宏。这两个宏的写法如下....

  • Linux 内核宏likely和unlikely

    本文介绍Linux 4.4内核宏likely()和unlikely()。 文件:include/linux/com...

  • likely()和unlikely()的用法

    dpdk中对likely()和unlikely()的定义[https://doc.dpdk.org/api/rte...

  • likely(unlikely)与pthread_once

    最近遇到些比较语法糖的知识,记录下来防止忘记。 1. likely与unlikely likely与unlikel...

  • 2019-07-22 【转】文章转载汇总

    可寻址资源系统介绍 Unity性能优化的最佳实践 Unity和Houdini场景程序化工作流程 使用Unity程序...

  • Java程序优化

    Java程序优化 参考书籍: Java程序性能优化 让你的Java程序更快、更稳定.pdf 性能分析-程序性能指...

  • React-Redux性能优化

    前面写了两篇文章《React组件性能优化》《Redux性能优化》,分别针对React和Redux在使用上的性能优化...

  • php优化

    使用数组作为参数来优化性能 代码的修改和升级很常见,但是频繁的操作会使程序性能降低,通过对其进行扩展,使用参数传递...

网友评论

      本文标题:使用likely和unlikely 优化程序性能

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