2

編集:C ++の場合、8つのフラグをテストする必要があります。処理速度の点でどちらがより効率的でしょうか:

単一のifステートメントで8つのbool変数をチェックするか、フラグを表すcharを持ち、フラグごとに1ビットを使用し、単一のifステートメントで単一のビット演算を使用しますか?

テストするフラグが1つある場合、違いはありますか?

4

4 に答える 4

5

チェックしたいすべてのビットの既知の値がある場合は、次のように比較する方がおそらく高速です。char

if (bitval == 0x82) ...

他を無視して特定のビットをチェックしたい場合は、「ビット」を別の変数に保持する方が速い場合があります。

if ((bitval7 == 1) && (bitval1 == 1)) ...

または、気にしないビットを単純にマスクする方が速い場合があります。

if ((bitval & 0x82) == 0x82) ...

本当に心配な場合は、両方の方法で保存することを選択し(同期を維持している場合)、関心のあるビット数に応じて選択できます.

しかし、正直なところ、速度の違いは非常に小さいため、無関係である可能性が高いため、それは深刻なやり過ぎだと考えています。

最適化する場合は、ほとんどの場合、ブール値の分離やループ方向の変更などのマイクロ最適化よりも、アルゴリズムの選択などのマクロの投資収益率が高くなります。

誤解しないでほしいのですが、これらのマイクロ最適化は特定の状況で違いを生む可能性がありますが、通常は最善の方法ではありません。

于 2012-09-07T02:53:18.940 に答える
2

私は一般的にビットごとのフラグのファンですが、通常、いくつかのサポート機能があると便利です。

inline bool TestAll( char flags, char value ) {
    return (flags & value) == value;
}

inline bool TestAny( char flags, char value ) {
    return (flags & value) != 0;
}

inline bool TestAllExclusive( char flags, char value ) {
    return flags == value;
}

inline bool TestAnyExclusive( char flags, char value ) {
    return (flags & value) != 0 && (flags & ~value) == 0;
}

同様の関数を使用してフラグ マスクを取得することもでき、魔法のようなものすべてを読みやすくすることができます。

テストする真の値がある場合、これは速度の点で勝者です。これは、定数を扱っているだけだからです。

typedef enum EmotiveFlags {
    E_ELATED       = 0x01,
    E_JOYOUS       = 0x02,
    E_NONPLUSED    = 0x04,
    E_BEWILDERED   = 0x08,
    E_ANNOYED      = 0x10,
    E_PUZZLED      = 0x20,
    E_ENRAGED      = 0x40,
    E_AMUSED       = 0x80
} EEmotiveFlags;

if( TestAny(flags, E_JOYOUS | E_ELATED | E_AMUSED) ) {
   //...
}
else if( TestAll(flags, E_ANNOYED | E_ENRAGED) && !TestAll(flags, E_AMUSED) ) {
   //...
}
于 2012-09-07T03:14:57.830 に答える
1

この質問は、実際にはコンパイラに要約されます。チェックするビットをどのように参照するかによって異なりますが、複数のビットをチェックしている限り、charの方が高速であると言っても過言ではありません。

フラグがメモリ内で隣接してスタックされるため、charを実行するのにかかるクロックサイクルの量は、個々の変数よりも著しく短くなり、メモリアドレス指定の必要がなくなります。

ただし、顕著な速度差が必要な場合は、チェック方法を変更しない限り、速度差を取得することはできません。

于 2012-09-07T03:00:17.497 に答える
0

最善の方法は、コードをアセンブラにコンパイルして調べることです。

8 つの bool フラグには 8 つのレジスタが必要です。これはたくさんあります。8 ビット フラグには 1 つのレジスタしか必要ありません。すべてのフラグを 1 つのレジスタに入れると、テストが非常に高速になります。

于 2015-04-19T16:08:09.283 に答える