static __always_inline void *kmalloc(size_t size, gfp_t flags) //
如果size
為變數,則呼叫
__kmalloc
分配物件
return __kmalloc(size, flags); }
在/linux/kmalloc_sizes.h
中,定義了一些巨集,如下:……
cache(256)
cache(512) ……
所以巨集展開後變成:
……if(32<=256)
goto found
;else
i++;
if(32<=512)
goto found
;else
i++;
……如果
size
為變數,比如以這種方式呼叫
kmalloc(a,gpf_kernel)
;則獲取高速緩衝區描述符的索引的**如下:
struct cache_sizes *csizep = malloc_sizes
;while (size > csizep->cs_size)
csizep++
;到底加入常量編譯器特性有多少效能提高呢:
只好用個
demo
來測試了:
demo1
代表常量處理的過程:
inti=0;
#define cache(x) /
if (1024<= x) ///1024
代表常量size
goto found; /
else /
i++;
cache(32)
cache(64)
cache(96)
cache(128)
cache(192)
cache(256)
cache(512)
cache(1024)
cache(2048)
found:
printf("i=%d/n",i);
return 0;
demo2
代表變數處理的過程:
int a[10]=;
int b=1024;//b
代表變數size
int* p=a;
while(b>*p)
p++;
printf("%d/n",*p);
這兩段demo都用gcc
–s demo1.c demo2.c
處理下生成彙編檔案,如下:
demo1.s:
main:
pushl%ebp
movl%esp, %ebp
subl$8, %esp
andl$-16, %esp
movl$0, %eax
subl%eax, %esp
//i=0
movl$0, -4(%ebp) //
把i位址賦給暫存器eax
leal-4(%ebp), %eax //
遞增i的值
incl(%eax)
leal-4(%ebp), %eax
incl(%eax)
leal-4(%ebp), %eax
incl(%eax)
leal-4(%ebp), %eax
incl(%eax)
leal-4(%ebp), %eax
incl(%eax)
leal-4(%ebp), %eax
incl(%eax)
leal-4(%ebp), %eax
incl(%eax) //
編譯器優化的結果就是:if else判斷被優化成7次直接的i++。
.l3:
。。。。。。//列印**略去
demo2.s:
main:
pushl%ebp
movl%esp, %ebp
subl$8, %esp
andl$-16, %esp
movl$0, %eax
subl%eax, %esp //
區域性變數b賦值為1024
movl$1024, -4(%ebp) //
獲取陣列a的開始位址
movl$a, -8(%ebp)
.l2: //
把陣列a中某元素的位址賦給edx
movl-8(%ebp), %edx //
把變數b的值賦給eax
movl-4(%ebp), %eax
比較陣列a中的元素與b值的大小
cmpl(%edx), %eax
jg.l4
jmp.l3
.l4: //
獲取陣列的下乙個元素
leal-8(%ebp), %eax
addl$4, (%eax)
jmp.l2
.l3:
。。。。。。//列印**略去
所以demo1只用了14條指令(每次遞增2條指令)
來獲取高速緩衝區的索引。
demo2
每次比較用7條指令*比較次數7=49條指令來獲取高速緩衝區的索引。
kmalloc第二個引數的意義
最近在進行linux核心程式設計的時候使用到了kmalloc用於申請記憶體,kmalloc與mlloc相似,用於獲取一段連續的記憶體空間,其不會對獲取到的記憶體空間清零。kmlloc的原型是void kmalloc size t size,int flags 第乙個引數size表示要分配的記憶體大小...
binary的常量優化
erlang的binary在這個網路程式裡面佔著非常重要的地位,所以otp團隊採用了非常多的優化手段包括 1.binary操作對應著 opcode 2.根據生命期和作用,有4種型別的binary 3.hipe優化,把bs 操作直接翻譯成asm指令 4.編譯器層面消除無必須的操作。下面的例子就是演示4...
c 的const常量優化
const int a 10 int b const cast a b 20 cout a b endl 輸出為10 20 原因如下 c 常量優化策略 a為const在編譯階段由於編譯器優化策略,會直接將上下文中出現a的地方替換掉。因而編譯結束時實際 語句相當於這樣 cout 10 b endl 如...