|
看内核的时候发现unlikely这个函数看不懂,一找,找到一个不错的帖子。
这两个函数实际上就是告诉编译器,怎么样优化程序。likely()的结果非常大的可能性是真,而unlikely的结果极大概率为假。
下面是原文:
Posted by
Kedar Sovani on Friday, February 11, 2005 - 04:46 @ KernelTrap.org
|
| Ever wondered what the likely and unlikely macros in the linux kernel are ? The macros are defined as : #define likely(x) __builtin_expect((x),1)#define unlikely(x) __builtin_expect((x),0) The __builtin_expect is a method that gcc (versions >= 2.96) offer for programmers to indicate branch prediction information to the compiler. The return value of __builtin_expect is the first argument (which could only be an integer) passed to it. To check it out how it could be beneficial, an excerpt from "info gcc" : if (__builtin_expect (x, 0))foo (); [This] would indicate that we do not expect to call `foo', since we expect `x' to be zero.
Based on this information the compiler generates intelligent code, such that the most expected result is favored. Let us consider it with a simple example function : [kedar@ashwamedha ~]$ cat abc.c int testfun(int x) { if(__builtin_expect(x, 0)) { ^^^--- We instruct the compiler, "else" block is more probable x = 5; x = x * x; } else { x = 6; } return x; }
[kedar@ashwamedha ~]$ gcc -O2 -c abc.c abc.o: file format elf32-i386 Disassembly of section .text: 00000000 : And let us see what happens if we make the "if" block more likely. [kedar@ashwamedha ~]$ cat abc.cint testfun(int x) { if(__builtin_expect(x, 1)) { ^^^ --- We instruct the compiler, "if" block is more probable x = 5; x = x * x; } else { x = 6; } return x; }
[kedar@ashwamedha ~]$ gcc -O2 -c abc.c abc.o: file format elf32-i386 Disassembly of section .text: 00000000 : |
510

被折叠的 条评论
为什么被折叠?



