utilizzo della memoria Java BigDecimal?
-
21-09-2019 - |
Soluzione
Se guardate i campi nella sorgente per BigDecimal
c'è:
BigDecimal:
long intCompact +8 bytes
int precision +4 bytes
int scale +4 bytes
String stringCache +?
BigInteger intVal +?
BigInteger:
int bitCount +4 bytes
int bitLength +4 bytes
int firstNonzeroIntNum +4 bytes
int lowestSetBit +4 bytes
int signum +4 bytes
int[] mag +?
Il commento per stringCache
dice
Utilizzato per memorizzare la rappresentazione di stringa canonica, se calcolata.
Supponendo che non si chiama .toString()
, rimarrà zero byte. Quindi BigDecimal
è (8 + 4 + 4) = 16 byte + BigInteger
.
BigInteger
sé è 4 + 4 + 4 + 4 + 4 = 20 byte + mag
.
20 + 16 dà totale di 36 byte più la grandezza, che è sempre il minimo numero di bit necessari a rappresentare l'intero pieno. Per un numero n
avrà bisogno bit log2(n)
, che possono essere convertiti in int. Si deve usare su:
36 + Ceiling(log2(n)/8.0) bytes
(notare che questo non include nessuna delle altre spese oggetto descrittore come il vostro collegamento ad esempio per le stringhe non, ma dovrebbe darvi una buona idea generale.)
Altri suggerimenti
Se si scava nel la struttura interna di BigDecimal
vedrai che utilizza una rappresentazione compatta se il significante è <= Long.MAX_VALUE
. Quindi, l'utilizzo della memoria può variare a seconda dei valori attuali si sta rappresentano.