2016-08-07 6 views
1

C++はビットを格納するためにbitsetを提供します。参照に従って、クラスはbool要素の配列をエミュレートしますが、領域割り当てに最適化されています。どちらの場合には、一方を他方に優先すべきか?ビットセットはboolの配列より高速ですか?

+2

もっと速いですか? – juanchopanza

+0

パフォーマンス統計情報を取得するためのコードを書かないのはなぜですか? –

+1

良い質問があります。両方の実装を使用して問題をベンチマークする必要があります。 – StoryTeller

答えて

1

ユースケースをベンチマークする必要があります。

    bitset<N>
  • 従来の実装ビット要素単位およびarray<bool, N>使用している - 前者はL1d..LLdに合うように、より高い変化を有するため、高速臨界サイズのビットマスクとすることができるので、バイト単位の要素シリアルアクセスを行う際に同時にアクセスするとき、いくつかのアクセスパターンが(高度にランダム)よく、array<bool, N>素子あたりより少ない競合
  • 遅くなければならないことができるので、性能に大きく依存するであろう下に、少なくとも
  • bitset<N>より数学を行いますアクセスパターン。
7

正しいことは測定を行うことです。

ビットセットについてのドキュメントでは、常にビットセットが実ビットであることが保証されていないと言われています。これはコンパイラの推奨事項であり、ビット操作のための便利な構文です。

組み込みシステムのコンパイラでは、このような種類のプログラムでビットを扱うことが本当に必要であるため、多くの場合、実際のビットセットが使用されます。

スピードに関しては、逆の方がより合理的です。インデックスを使用することで、配列の操作が簡単になります。ビットを使って作業するには、正しい単語にアクセスして正しいビットにアクセスするために、より多くの計算が必要です。

+1

"ビットシフトは余分な作業を意味するので、遅くする必要があります!"合理的な音、実際には追加のコストは2つの追加のシフト、2つのands(せいぜい)です。現代のCPUでは約2サイクルです。しかし、メモリの容量を8倍に増やしただけで、パフォーマンスに大きな影響を与える可能性があります。だから、はっきりとしたものではありません。 – Voo

関連する問題