宏比函數(shù)實(shí)現(xiàn)在時(shí)間上的優(yōu)越性探討

字號(hào):

在某些程序設(shè)計(jì)中,有些方法可以用函數(shù)來(lái)實(shí)現(xiàn)也可以用宏定義來(lái)實(shí)現(xiàn).一般來(lái)說(shuō)用宏定義的方法在時(shí)間上占有相當(dāng)大的優(yōu)勢(shì),在空間上有時(shí)也占一定的優(yōu)勢(shì).這是因?yàn)楹瘮?shù)在調(diào)用時(shí),需要保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng),所進(jìn)行的壓棧和出棧操作.此外,函數(shù)在調(diào)用時(shí)要形參分配臨時(shí)空間,還要對(duì)實(shí)參和形參的傳遞等處理.而宏在程序中只是將它展開直接插入到程序段中,因此不需要像函數(shù)調(diào)用那樣.因此宏定義節(jié)約了一定的CPU處理時(shí)間.下面給出二個(gè)例子,就能更形象說(shuō)明問(wèn)題了.
    例子一:用函數(shù)實(shí)現(xiàn)
    #include
    int GETMAX(int x,int y,int z)
    {
     return (x>=y?x:y)>z?(x>y?x:y):z;
    }
    int tGETMAX(int x,int y,int z,int m,int n,int p)
    {
     return GETMAX(x,y,z)>=GETMAX(m,n,p)?GETMAX(x,y,z):GETMAX(m,n,p);
    }
    int main(void)
    {
     time_t start,end;
     long i;
     clrscr();
     start=clock();
     for(i=0;i<10000000;i++)
     tGETMAX(1,2,3,4,5,6);
     end=clock();
     printf("%lf",(double)(end-start)/CLK_TCK);
     getch();
    }
    執(zhí)行時(shí)間:1.373626秒
    可執(zhí)行文件大小:29,938字節(jié)
    例子二:用宏實(shí)現(xiàn)
    #include
    #include
    #include
    #define GETMAX(X,Y,Z) ((X>=Y?X:Y)>=Z?(X>Y?X:Y):Z)
    #define tGETMAX(X,Y,Z,M,N,P) \ /*由于一行不好寫,所以將其寫到第二行,但要加一個(gè)'\'作標(biāo)記*/
    (GETMAX(X,Y,Z)>=GETMAX(M,N,P)?GETMAX(X,Y,Z):GETMAX(M,N,P))
    int main(void)
    {
     time_t start,end;
     long i;
     clrscr();
     start=clock();
     for(i=0;i<10000000;i++)
     tGETMAX(1,2,3,4,5,6);
     end=clock();
     printf("%lf",(double)(end-start)/CLK_TCK);
     getch();
    }
    執(zhí)行時(shí)間:0.054945秒,可執(zhí)行文件大小:29,497字節(jié)
    由于上面二個(gè)例子可見:在時(shí)間上1.373626秒與0.054945秒之間的差值.在空間上29,938字節(jié)與29,497字節(jié)之間的差值.
    這里需要注意的是,使用宏來(lái)實(shí)現(xiàn)在空間上的優(yōu)勢(shì)只當(dāng)宏使用得很少.但當(dāng)宏使用得多空間效率就沒(méi)有用函數(shù)來(lái)實(shí)現(xiàn)的好.