拒絕switch,程式加速之函式指標陣列
阿新 • • 發佈:2018-12-26
先看一個使用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語句產生類似的效果。