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[]
BitSet
int
byte
ただし、キャッシュ サイズが重要になると、低速のキャッシュまたはメイン メモリを使用する場合のオーバーヘッドと比較して、BitSet のオーバーヘッドが減少する可能性があります。
要するに、疑わしい場合は BitSet を使用してください。これは、意図が明確であり、より高速である可能性が高いためです。
実際には、JVMに依存しています。たとえば、SunJVMはboolean
タイプをに変換しint
ます。つまり、ブール変数でさえ32ビットを使用します。ただし、jvmはブール配列を最適化し、ブール配列セルごとに8ビットを予約します。
ビット フラグを列挙型に置き換えることを検討してください。次に、Bitset の代わりに EnumSet などを使用できます。
Java は内部的に保管boolean
します。int
だからint[]
とboolean[]
はまったく同じです。
BitSet
より少ないメモリを使用します。速いかどうかは、使用パターンによって異なります。
メモリ使用量の降順
int[n] > Bitset(n) > boolean[n]
ただし、インデックスへのアクセスでは、違いはありません。