Java では、どちらが高速でメモリが少なくて済みますint[n]か?boolean[n]Bitset(n)
nこの質問は、小さい (まで1000)、中 (からnの間)、1000および100000巨大な (nより大きい100000) サイズの配列に適用できます。ありがとうございました。
フラグ (1/0) ストレージを実現したい。
Java では、どちらが高速でメモリが少なくて済みますint[n]か?boolean[n]Bitset(n)
nこの質問は、小さい (まで1000)、中 (からnの間)、1000および100000巨大な (nより大きい100000) サイズの配列に適用できます。ありがとうございました。
フラグ (1/0) ストレージを実現したい。
ほとんどの JVM では。配列またはオブジェクトには 12 ~ 16 バイトのオーバーヘッドがあります。Aintは 4 バイトをboolean使用し、A は 1 バイトを使用します (必須ではありませんが、OpenJDK/HotSpot では使用されます) BitSet は 2 つのオブジェクトと、小さなセットの場合により多くのメモリを使用しますが、1 つにつき 1 ビットしか使用しません。したがって、小さなコレクションの場合、int[]は よりも小さくなる可能性がありますBitSetが、サイズが大きくなると、BitSet が最小になります。
データ構造がキャッシュよりも小さい場合、最速は次のint[]とおりです。boolean[]BitSetintbyte
ただし、キャッシュ サイズが重要になると、低速のキャッシュまたはメイン メモリを使用する場合のオーバーヘッドと比較して、BitSet のオーバーヘッドが減少する可能性があります。
要するに、疑わしい場合は BitSet を使用してください。これは、意図が明確であり、より高速である可能性が高いためです。
実際には、JVMに依存しています。たとえば、SunJVMはbooleanタイプをに変換しintます。つまり、ブール変数でさえ32ビットを使用します。ただし、jvmはブール配列を最適化し、ブール配列セルごとに8ビットを予約します。
ビット フラグを列挙型に置き換えることを検討してください。次に、Bitset の代わりに EnumSet などを使用できます。
Java は内部的に保管booleanします。intだからint[]とboolean[]はまったく同じです。
BitSetより少ないメモリを使用します。速いかどうかは、使用パターンによって異なります。
メモリ使用量の降順
int[n] > Bitset(n) > boolean[n]
ただし、インデックスへのアクセスでは、違いはありません。