高效的C編程之:寄存器分配
比較下面兩個完成同樣功能的函數(shù),分析全局變量的操作對程序性能的影響。
intf(void);
intg(void);
interrs;
voidtest1(void)
{
errs+=f();
errs+=g();
}
voidtest2(void)
{
intlocalerrs=errs;
localerrs+=f();
localerrs+=g();
errs=localerrs;
}
編譯結(jié)果如下。
test1
STMDBsp!,{v1,lr}
BLf
LDRv1,[pc,#L00002c-.-8]
LDRa2,[v1,#0]
ADDa1,a1,a2
STRa1,[v1,#0]
BLg
LDRa2,[v1,#0]
ADDa1,a1,a2
STRa1,[v1,#0]
LDMIAsp!,{v1,pc}
L00002c
DCD|x$dataseg|
test2
STMDBsp!,{v1,v2,lr}
LDRv1,[pc,#L00002c-.-8]
LDRv2,[v1,#0]
BLf
ADDv2,a1,v2
BLg
ADDa1,a1,v2
STRa1,[v1,#0]
LDMIAsp!,{v1,v2,pc}
從編譯的結(jié)果中可以看出,test1中每次對全局變量errs的訪問都會使用耗時的Load/Store指令;而test2只使用了一次內(nèi)存訪問指令。這對提高程序的整體性能有很大幫助。
3.指針鏈
指針鏈(PointerChains)常被用來訪問結(jié)構(gòu)體內(nèi)部變量。下面的例子顯示了一個典型的指針鏈的使用。
typedefstruct{intx,y,z;}Point3;
typedefstruct{Point3*pos,*direction;}Object;
voidInitPos1(Object*p)
{
p->pos->x=0;
p->pos->y=0;
p->pos->z=0;
}
上面的代碼每次使用“p->pos”時都會對變量重新取值。為了提高代碼效率,將程序改寫如下。
voidInitPos2(Object*p)
{
Point3*pos=p->pos;
pos->x=0;
pos->y=0;
pos->z=0;
}
經(jīng)過改寫的代碼,減少了內(nèi)存訪問次數(shù),提高程序的執(zhí)行效率,另外也可以在object結(jié)構(gòu)體中增加一個point3域,專門作為指向p->pos的指針。
塵埃粒子計數(shù)器相關(guān)文章:塵埃粒子計數(shù)器原理
評論