Pregunta

¿Existe una pauta para estimar la cantidad de memoria consumida por un BigDecimal?

Buscando algo parecido a estos pautas para estimar String uso de memoria.

¿Fue útil?

Solución

Si nos fijamos en los campos de la fuente para BigDecimal hay:

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 +?

el comentario para stringCache dice

Se utiliza para almacenar la representación de cadena canónica, si se calcula.

Suponiendo que no llames .toString(), permanecerá en cero bytes.Por eso BigDecimal es (8+4+4)=16 bytes + BigInteger.

BigInteger en sí mismo es 4+4+4+4+4=20 bytes + mag.

20+16 da un total de 36 bytes más la magnitud, que siempre es el número mínimo de bits necesarios para representar el número entero completo.por un numero n será necesario log2(n) bits, que se pueden convertir a enteros.Deberías utilizar aproximadamente:

36 + Ceiling(log2(n)/8.0) bytes

(tenga en cuenta que esto no incluye ninguna otra sobrecarga de descriptores de objetos como lo hace su enlace de ejemplo para cadenas, pero debería darle una buena idea general).

Otros consejos

Si se mira en las interioridades de BigDecimal verá que utiliza una representación compacta si la mantisa es <= Long.MAX_VALUE. Por lo tanto, el uso de la memoria puede variar dependiendo de los valores reales que están representando.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top