Domanda

C'è una linea guida per la stima della quantità di memoria consumata da un BigDecimal?

In cerca di qualcosa di simile a queste linee guida per stimare l'utilizzo della memoria String.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top