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

字號:

在某些程序設(shè)計中,有些方法可以用函數(shù)來實現(xiàn)也可以用宏定義來實現(xiàn).一般來說用宏定義的方法在時間上占有相當大的優(yōu)勢,在空間上有時也占一定的優(yōu)勢.這是因為函數(shù)在調(diào)用時,需要保護現(xiàn)場和恢復(fù)現(xiàn)場,所進行的壓棧和出棧操作.此外,函數(shù)在調(diào)用時要形參分配臨時空間,還要對實參和形參的傳遞等處理.而宏在程序中只是將它展開直接插入到程序段中,因此不需要像函數(shù)調(diào)用那樣.因此宏定義節(jié)約了一定的CPU處理時間.下面給出二個例子,就能更形象說明問題了.
    例子一:用函數(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í)行時間:1.373626秒
    可執(zhí)行文件大小:29,938字節(jié)
    例子二:用宏實現(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) \ /*由于一行不好寫,所以將其寫到第二行,但要加一個'\'作標記*/
    (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í)行時間:0.054945秒,可執(zhí)行文件大小:29,497字節(jié)
    由于上面二個例子可見:在時間上1.373626秒與0.054945秒之間的差值.在空間上29,938字節(jié)與29,497字節(jié)之間的差值.
    這里需要注意的是,使用宏來實現(xiàn)在空間上的優(yōu)勢只當宏使用得很少.但當宏使用得多空間效率就沒有用函數(shù)來實現(xiàn)的好.