int error = path_lookupat(nd, flags | LOOKUP_DIRECTORY, &path); if (unlikely(error)) return error; 经过学习后,知道调用likely()或unlikely()告诉编译器这个条件很有可能或者不太有可能发生,好让编译器对这个条件判断进行正确地优化。这两个宏的定义如下: # define likely(x) __builtin_expect(!!(x...
也就是说,使用 likely(),执行 if 后面的语句的机会更大,使用 unlikely(),执行 else 后面的语句机会更大一些。 通过这种方式,编译器在编译过程中,会将可能性更大的代码紧跟着后面的代码,从而减少指令跳转带来的性能上的下降。 这样cache 在预取数据时可以尽量取到真正要跑的数据,增加了 cache 的命中率。 不用...
1) #define unlikely(x) __builtin_expect(!!(x), 0) int test_likely(int x) { if(likely(x)) x = 5; else x = 6; return x; } int test_unlikely(int x) { if(unlikely(x)) x = 5; else x = 6; return x; }
在Linux kernel的源代码中,经常能见到if(likely(x))或if(unlikely(x))之类的用法,其确切含义需要说明一下,以便更好的理解kernel的源代码。 likely与unlikely这两个宏在linux/compiler.h中的定义如下: (x) __builtin_expect(!!(x),1) (x) __builtin_expect(!!(x),0) 很明显,需要先弄清楚这个__built...
1 在linux kernel源码里经常可以看到likely与unlikely这两个关键字的使用,查了下源码,原来这两个关键字是两个宏,在kernel源码的include/linux/compiler.h文件中有如下定义(linux-3.11.0-rc1):2 由于CONFIG_PROFILE_ALL_BRANCHES没有定义,故而两个宏对应的定义如下:3 # define likely(x) __builtin_expect...
使用likely ,执行if后面语句的可能性大些,编译器将if{}是的内容编译到前面, 使用unlikely ,执行else后面语句的可能性大些,编译器将else{}里的内容编译到前面。这样有利于cpu预取,提高预取指令的正确率,因而可提高效率。 举个例子(内核版本2.6.22.6):/kernel/shed.c中有一段: ...
linux-kernel之likely和unlikely 在阅读linux源代码的时候,我们经常会发现likely和unlikely,这两个宏语句定义在compiler.h下, #define likely(x)__builtin_expect(!!(x), 1) #define unlikely(x)__builtin_expect(!!(x), 0) 这里我们需要先了解__builtin_expect:# define __builtin_expect(x, expected_...
以下是整理的一些linux kernel中的常见宏,由于不同体系架构,或者不同模块的宏定义不同,只挑选了其中容易看懂的宏作为记录,实现的功能大体一样。 Linux内核中do{...}while(0)意义: 辅助定义复杂的宏,避免引用的时候出错,如果不用{},if后面的语句只有第一条进行了判断。同时避免宏展开后“;”造成编译不通过. ...
if (likely(ac-avail < ac->limit)) { ...} else { } /*x 可以为运算表达式*/ 4. container_or() 如果结构A包含一个子结构B,则A称之为B的一个容器,例如: struct A { ... struct B { }element; ... } container; 查找元素的容器对象实例(kernel.h): ...
(http://blog.csdn.net/ce123) GCC GCC version::arm-linux-gcc-3.4.1 看内核时经常遇到if(likely()){}或是if(unlikely())这样的语句,不甚了解,例如(选自kernel/fork.c 中copy_process): SET_LINKS(p); if(unlikely(p->ptrace&PT_PTRACED)) __ptrace_link(p,current->parent); 下面详细分析一下...