久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
__builtin_expect詳解
[打印本頁]
作者:
liuda
時間:
2015-1-23 19:25
標題:
__builtin_expect詳解
在GTK+2.0源碼中有很多這樣的宏:G_LIKELY和G_UNLIKELY。比如下面這段代碼:
if (G_LIKELY (acat == 1)) /* allocate through magazine layer */
{
ThreadMemory *tmem = thread_memory_from_self();
guint ix = SLAB_INDEX (allocator, chunk_size);
if (G_UNLIKELY (thread_memory_magazine1_is_empty (tmem, ix)))
{
thread_memory_swap_magazines (tmem, ix);
if (G_UNLIKELY (thread_memory_magazine1_is_empty (tmem, ix)))
thread_memory_magazine1_reload (tmem, ix);
}
mem = thread_memory_magazine1_alloc (tmem, ix);
}在源碼中,宏G_LIKELY和G_UNLIKELY 是這么定義的:
#define G_LIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 1))
#define G_UNLIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 0))宏_G_BOOLEAN_EXPR的作用是把expr轉換為0和1,即真假兩種。要理解宏G_LIKELY和G_UNLIKELY ,很明顯必須理解__builtin_expect。__builtin_expect是GCC(version>=2.9)引進的宏,其作用就是幫助編譯器判斷條件跳轉的預期值,避免跳轉造成時間亂費。拿上面的代碼來說:
if (G_LIKELY (acat == 1)) //表示大多數情況下if里面是真,程序大多數直接執行if里面的程序
而
if (G_UNLIKELY (thread_memory_magazine1_is_empty (tmem, ix)))//表示大多數情況if里面為假,程序大多數直接執行else里面的程序
可能大家看到還是一頭霧水,看下面一段就會明白其中的樂趣啦;
//test_builtin_expect.c
#define LIKELY(x) __builtin_expect(!!(x), 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;
}[lammy@localhost test_builtin_expect]$ gcc -fprofile-arcs -O2 -c test_builtin_expect.c
[lammy@localhost test_builtin_expect]$ objdump -d test_builtin_expect.otest_builtin_expect.o: file format elf32-i386
Disassembly of section .text:00000000 <test_likely>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 8b 45 08 mov 0x8(%ebp),%eax
6: 83 05 38 00 00 00 01 addl $0x1,0x38
d: 83 15 3c 00 00 00 00 adcl $0x0,0x3c
14: 85 c0 test %eax,%eax
16: 74 15 je 2d <test_likely+0x2d>//
主要看這里
18: 83 05 40 00 00 00 01 addl $0x1,0x40
1f: b8 05 00 00 00 mov $0x5,%eax
24: 83 15 44 00 00 00 00 adcl $0x0,0x44
2b: 5d pop %ebp
2c: c3 ret
2d: 83 05 48 00 00 00 01 addl $0x1,0x48
34: b8 06 00 00 00 mov $0x6,%eax
39: 83 15 4c 00 00 00 00 adcl $0x0,0x4c
40: 5d pop %ebp
41: c3 ret
42: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi
49: 8d bc 27 00 00 00 00 lea 0x0(%edi,%eiz,1),%edi00000050 <test_unlikely>:
50: 55 push %ebp
51: 89 e5 mov %esp,%ebp
53: 8b 55 08 mov 0x8(%ebp),%edx
56: 83 05 20 00 00 00 01 addl $0x1,0x20
5d: 83 15 24 00 00 00 00 adcl $0x0,0x24
64: 85 d2 test %edx,%edx
66: 75 15 jne 7d <test_unlikely+0x2d>//
主要看這里
68: 83 05 30 00 00 00 01 addl $0x1,0x30
6f: b8 06 00 00 00 mov $0x6,%eax
74: 83 15 34 00 00 00 00 adcl $0x0,0x34
7b: 5d pop %ebp
7c: c3 ret
7d: 83 05 28 00 00 00 01 addl $0x1,0x28
84: b8 05 00 00 00 mov $0x5,%eax
89: 83 15 2c 00 00 00 00 adcl $0x0,0x2c
90: 5d pop %ebp
91: c3 ret
92: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi
99: 8d bc 27 00 00 00 00 lea 0x0(%edi,%eiz,1),%edi000000a0 <_GLOBAL__I_65535_0_test_likely>:
a0: 55 push %ebp
a1: 89 e5 mov %esp,%ebp
a3: 83 ec 08 sub $0x8,%esp
a6: c7 04 24 00 00 00 00 movl $0x0,(%esp)
ad: e8 fc ff ff ff call ae <_GLOBAL__I_65535_0_test_likely+0xe>
b2: c9 leave
b3: c3 ret
[lammy@localhost test_builtin_expect]$兩個函數編譯生成的匯編語句所使用到的跳轉指令不一樣,仔細分析下會發現__builtin_expect實際上是為了滿足在大多數情況不執行跳轉指令,所以__builtin_expect僅僅是告訴編譯器優化,并沒有改變其對真值的判斷。
這種用法在linux內核中也經常用到,國外也有一篇相關的文章,大家不妨看看:
http://kernelnewbies.org/FAQ/LikelyUnlikely
不知大家注意到沒有,我在生產匯編時用的是gcc -fprofile-arcs -O2 -c test_builtin_expect.c,而不是gcc -O2 -c test_builtin_expect.c,具體可以參考
http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
。
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
一区二区三区在线免费
|
天堂色综合
|
久久久影院
|
亚洲一区 中文字幕
|
手机日韩
|
手机在线不卡av
|
天天干天天操天天看
|
欧美一级二级三级视频
|
成人国产一区二区三区精品麻豆
|
日韩在线综合
|
国产激情视频网址
|
精品一区二区久久
|
天天拍天天色
|
av激情在线
|
久久久久久成人
|
中文字幕第一页在线
|
国产91久久精品一区二区
|
日韩黄色av
|
成人av电影天堂
|
中文字幕在线观看视频网站
|
欧美一区2区三区3区公司
|
亚洲成av人片在线观看无码
|
2019中文字幕视频
|
亚洲免费视频一区
|
日本涩涩视频
|
国产视频黄色
|
日日操天天射
|
久久精品国产免费一区二区三区
|
午夜电影日韩
|
免费黄色a视频
|
99久久精品国产一区二区三区
|
天天影视网天天综合色在线播放
|
av黄色免费在线观看
|
亚洲国产精品99久久久久久久久
|
人人操日日干
|
成人h视频在线
|
一区二区三区四区免费在线观看
|
久久综合一区二区三区
|
久久aⅴ乱码一区二区三区 91综合网
|
国产精品中文字幕在线
|
激情视频一区
|