kmalloc中的常量引數優化處理

2021-05-24 01:29:42 字數 2587 閱讀 4905

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 如...