python encoding=utf-8,python encoding=utf-8-s

  python encoding=utf-8,python encoding=utf-8-s

  序言内核版本:linux 4.13

  在linux内核中,if (easy (x))和if (impossible))语句非常常见,那么它们是什么意思呢?本文将对可能和不可能进行一些讨论。

  可能和不太可能引用/include/linux/compiler.h */

  # define likely(x)_ _ builtin _ expect(!(x),1)# define unprobable(x)_ _ builtin _ expect(!(x)、(0)在上面的源代码中,是由内置函数__builtin_expect定义的,内置函数。

  __builtin_expect的函数原型为long __builtin_expect (long exp, long c),返回值是完整公式exp的值,起到期望公式exp的值等于c的作用,如果有很大几率满足exp==c的条件,性能会提高;否则性能会降低。)。请注意__Builtin_expect(lexp,c)的返回值仍然是exp值本身,exp的值不会改变。

  __builtin_expect函数用于指导gcc进行条件分支预测。在执行一条指令的同时,CPU可以通过流水线同时读取下一条指令,可以提高CPU的利用率。在执行条件分支指令时,CPU会提前卸载一条指令执行,但如果由于条件分支而跳转到另一条指令,那么CPU预取的下一条指令就会被浪费,导致流水线效率降低。

  另外,跳转指令相对于顺序执行的指令会多消耗CPU时间如果能尽量避免跳转,也能提高CPU性能。

  单纯从表面上看,if(易(值))=if(值),if(不可能))==if(值)。

  这意味着可能性和不可能性是相同的,但实际实现是不同的。加likely表示值很可能为真,有很大机会运行if,而impossible很可能为假,有很大机会运行else。

  通过这种修改,当编译成二进制代码时,可能使if之后的执行语句继续到前一个程序,而不太可能使else之后的语句继续到前一个程序,即cache预读取,prope。

  那么,为什么在上面的定义中使用执行速度这个符号呢?

  计算机的布尔逻辑只有0和1,除了0是1。如果likely(x)的参数不是逻辑值,则可以使用!!符号将其转换为逻辑值1或0。比如,(3)=!()!(3) )=0=1.现在,是时候将参数3转换为逻辑1了。

  如果你简单的理解

  Likely(x)表示x为逻辑真的可能性高;

  不太可能(x)意味着x很可能是逻辑假(0)。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: