1. 程式人生 > >拒絕switch,程式加速之函式指標陣列

拒絕switch,程式加速之函式指標陣列

先看一個使用switch語句的程式:

#include <stdio.h>
#include <time.h>

//加法
int add(int a,int b)
{
	return a+b;
}

//減法
int subtract(int a,int b)
{
	return a-b;
}

//乘法
int multi(int a,int b)
{
	return a*b;
}

//除法
int divide(int a,int b)
{
	return a/b;
}

int claculate(int a,int b,char oper)
{
	//這裡使用switch語句
	switch (oper)
	{
	case '+':
		return add(a,b);
	case '-':
		return subtract(a,b);
	case '*':
		return multi(a,b);
	case '/':
		return divide(a,b);
	default:
		return -1;
		break;
	}
}


void main()
{
	int a = 250;
	int b = 5;
	//統計程式執行時間
	clock_t start, finish; 
	start = clock();
	printf("%d\n",claculate(a,b,'+'));
	printf("%d\n",claculate(a,b,'-'));
	printf("%d\n",claculate(a,b,'*'));
	printf("%d\n",claculate(a,b,'/'));
	finish = clock();
	printf( "%f seconds\n", (double)(finish - start) / CLOCKS_PER_SEC );  
}
再看一個使用函式指標陣列的程式
#include <stdio.h>
#include <time.h>

//加法
int add(int a,int b)
{
	return a+b;
}

//減法
int subtract(int a,int b)
{
	return a-b;
}

//乘法
int multi(int a,int b)
{
	return a*b;
}

//除法
int divide(int a,int b)
{
	return a/b;
}



int claculate(int a,int b,int oper)
{
	//其實這裡應該使用hashMap,將字元'+'對映到add函式。
	//直接使用數字是為了簡便

	//宣告指向函式指標的陣列
	int (*pfunc[])(int a,int b)  = {add,subtract,multi,divide};

	return pfunc[oper](a,b);
}


void main()
{
	int a = 250;
	int b = 5;
	//統計程式執行時間
	clock_t start, finish; 
	start = clock();
	printf("%d\n",claculate(a,b,0));
	printf("%d\n",claculate(a,b,1));
	printf("%d\n",claculate(a,b,2));
	printf("%d\n",claculate(a,b,3));
	finish = clock();
	printf( "%f seconds\n", (double)(finish - start) / CLOCKS_PER_SEC );  
}

當switch判斷語句中case的個數不多時,上面兩個程式差不多。但如果case很多時,使用函式指標陣列要快很多。 類似地,在Java裡面也可以使用反射來取代swith語句產生類似的效果。