2011-06-20 8 views
0

を切り替える: ENUM_ELEMは、列挙型の要素であり、私はあなたのENUM_ELEM#が低い範囲内にある場合は、あなたが使用することができ列挙型パラメータの機能と、そのようなコードを最適化するためにどのように最適化

short int f(short int b){ 
    switch(b){ 
     case ENUM_ELEM1 : return -12; 
     case ENUM_ELEM2 : return 0; 
     case ENUM_ELEM3 : return 12; 
    } 
} 
+0

あなたはそれを最適化しますか?実行時のパフォーマンス、読みやすさ、簡潔さ?パフォーマンスが向上したと思われる現在のパフォーマンスについて何を観察しましたか? –

+0

列挙型の定義を投稿します。最適化は、その値、およびその値の数によって異なります。 – Nawaz

+0

ENUM – irc93000

答えて

2

、このようなスイッチを避けたいですテーブルを作成し、列挙型の値をテーブルのインデックスとして使用して、返された値を取得します。対策、対策、対策:

しかし、私はいくつかのスマートなコンパイラはそれ自体でコードをこのように最適化することができることを想像することができます...

は、最適化の3つのルールを忘れないでください。

0

あなたの列挙型は、コンパクトであれば、

1

にオプションのカップルルックアップテーブルを使用します。あなたの列挙型の値が連続したデフォルト値(例:0,1,2)であれば

を - テーブルを作成:

int translate[ENUM_ELEM3] = {-12,0,12}; 
return translate[ENUM_VALUE]; 

あるいは、#define -12,0,12、それら、あなたは、とにかくないenumshort intを渡します。

IIRC新標準(C++ 0x)では、enumの値を負にすることができます。コンパイラがそれをサポートしているかどうかを確認しても問題はありません。

+0

新しいC++ 0x標準?私は古い標準でもenum値が負であることができると信じています! – Ajay

+0

@Ajay - 明示的に許可しているかわかりません。ここでこれに関する議論です:http://stackoverflow.com/questions/159034/are-c-enums-signed-or-unsigned – littleadv

0

これはコード品質/保守性w.r.tについての場合です。 OOPでは、リファクタリングを "conditional with polymorphism"に置き換えることができます。 (あなたがあなたのアプリケーションの本当ボトルネックを確認が完了するまで気にはならない、ともあなたが途中でそれらを気にしてはならない)、パフォーマンスの最適化の場合

、あなたは古き良き、ルックアップを使用することができますそれは、または(再び)であるように、テーブル、単にあなたのCPUは、15歳未満


コンパイラは、すでに多くのスイッチを最適化しているので、それがあるようにそこにそれを聞かせてあり、それを聞かせてステートメント(しかし、あなたはあなたの共同mpilerは、実際にENUM_ELEM2の値がゼロである、ENUM_ELEM1の値が負であることを提供

投機的実行、分岐予測とあなたの分岐ターゲットバッファは非常によく、あなたとコンパイラ

0

よりも良いかもしれません)あなたのために行いますENUM_ELEM3の値は正である。

その後、あなたは以下のことで読みやすさへのrefuctorにしたいことがあります。

static final short unPos = (short)(1 << 15); 

static short f(short b) 
{ 
    return (short)(b == 0 ? 0 : (b &= unPos) == unPos ? -12 : 12); 
} 

私はJavaで実装されていることに気づくが、私はあなたが選択した言語のために、対応する構文があります推測してください。

関連する問題