如何優化switch語句
程式設計的過程中難免會使用到switch語句,case如果少的情況下,效率和效能還可以,如果出項比較多的case的情況下,
還使用swtich,將會大大影響程式的效能。如何優化這樣比較大的switch語句呢?有三種方法:
第一種方法就是根據頻率來排列case的位置,對於頻率較高的case放到前面,而不是按照
case的值得有序排列,例如:
switch (type)
假設18,和19地使用頻率最高,則修改為
switch (type)
這種方法只使用於一些case語句不多的情況,如果case語句很多,最好還是採用後面兩種方法。
第二種方法就是使用巢狀的switch,將原來的線性判斷,修改二級樹的形式判斷,例子如下
switch (type)
修改為:
if (1< type && type <50)
; // this may be encapsulated as a function.
} else if (51< m_pdutype && m_pdutype <99)
; // this may be encapsulated as a function.
} else if ()
這樣就可以減少判斷地次數, 從而提高效率, 並且在每乙個switch中需要將頻率使用比較高的case放到前面。
第三種方法,如果case的值是有序遞增或者有一定規律的,就可以使用函式陣列:
例如:可以抽象出所有的case處理函式需要的引數,這裡簡單的以乙個整形引數為例,建設函式
可以抽象為:
int handlecase1(void);
int handlecase2(void);
int handlecase3(void);
int handlecase4(void);
typedef void (*handlecasefunc)(void) ;
handlecasefunc g_apfuncarray[200]
=;
根據這種方法,可以把一下的switch語句:
switch (type)
可以修改為:
g_apfuncarray[(type)-1](type);
是不是很簡單呢?
不過這種方法也有乙個缺點,就是初始化陣列要細心, 如果函式的位置搞錯了,可就麻煩了。
當然,如果type的值很分散,沒有規律可以找,例如:1,5,13,29, 57...就不太適合使用
函式陣列。實在想使用的話就只有修改設計了,將type的值修改的有規例。
我在優化switch的過程中遇到過type的值是有兩段的,第一段是1~109, 第二段是10001~10031,
我就編寫了乙個巨集實現從type值到函式陣列索引得轉換
#define get_ype_index(type) (type) < 10000 ? (type): (type)-9850;
之所以減9850是預留109~150以防備將來擴充套件使用。
當然如果是2,4,6,8這樣的可以通過type/2來獲得等等。
switch語句的優化
switch語句的優化 flyfish 通常的形式 void test int t 一 當 段比較多時候 就會提取函式 void test int t void function1 void function2 二 當類中有型別時可以使用設計模式優化 例如class employee 優化為 cla...
語句 switch語句
switch語句的特點如下 1 switch x 被選擇的內容 即x 只能是byte,short,int,char這四種型別 2 備選答案並沒有指定的順序,但是執行肯定是從第乙個case開始的,如果其中有匹配的case,執行完,通過該case的break就結束了switch。如果沒有匹配的case,...
python之switch語句,優化多個if語句
python中並沒有多分支的語句。像c語言中有switch語句,可以避免多個if的使用場合,簡化 python若想實現多分支的功能需要自己構建 涉及到裝飾器的知識點。下面舉個例子。switch dicts defdeco data def if data not inswitch dicts.key...