1

Java では、どちらが高速でメモリが少なくて済みますint[n]か?boolean[n]Bitset(n)

nこの質問は、小さい (まで1000)、中 (からnの間)、1000および100000巨大な (nより大きい100000) サイズの配列に適用できます。ありがとうございました。

フラグ (1/0) ストレージを実現したい。

4

5 に答える 5

2

ほとんどの JVM では。配列またはオブジェクトには 12 ~ 16 バイトのオーバーヘッドがあります。Aintは 4 バイトをboolean使用し、A は 1 バイトを使用します (必須ではありませんが、OpenJDK/HotSpot では使用されます) BitSet は 2 つのオブジェクトと、小さなセットの場合により多くのメモリを使用しますが、1 つにつき 1 ビットしか使用しません。したがって、小さなコレクションの場合、int[]は よりも小さくなる可能性がありますBitSetが、サイズが大きくなると、BitSet が最小になります。

データ構造がキャッシュよりも小さい場合、最速は次のint[]とおりです。boolean[]BitSetintbyte

ただし、キャッシュ サイズが重要になると、低速のキャッシュまたはメイン メモリを使用する場合のオーバーヘッドと比較して、BitSet のオーバーヘッドが減少する可能性があります。

要するに、疑わしい場合は BitSet を使用してください。これは、意図が明確であり、より高速である可能性が高いためです。

于 2012-09-26T07:59:18.180 に答える
1

実際には、JVMに依存しています。たとえば、SunJVMはbooleanタイプをに変換しintます。つまり、ブール変数でさえ32ビットを使用します。ただし、jvmはブール配列を最適化し、ブール配列セルごとに8ビットを予約します。

于 2012-09-26T07:53:09.497 に答える
0

ビット フラグを列挙型に置き換えることを検討してください。次に、Bitset の代わりに EnumSet などを使用できます。

于 2012-09-26T08:05:38.490 に答える
0

Java は内部的に保管booleanします。intだからint[]boolean[]はまったく同じです。

BitSetより少ないメモリを使用します。速いかどうかは、使用パターンによって異なります。

于 2012-09-26T07:46:20.083 に答える
0

メモリ使用量の降順

int[n] > Bitset(n) > boolean[n] 

ただし、インデックスへのアクセスでは、違いはありません。

于 2012-09-26T07:46:44.757 に答える