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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。