2010-03-23 6 views
17

Gibt es eine Richtlinie zum Abschätzen der Speichermenge, die von einem BigDecimal verbraucht wird?Java BigDecimal Speicherverbrauch?

Auf der Suche nach etwas ähnlich wie diese guidelines für die Schätzung String Speicherverbrauch.

+0

Ähnliches mit einer größeren Konstante. Natürlich, wie 'String', ist es abhängig von der Implementierung. –

+0

Haben Sie diesen gelesen: http://www.javaworld.com/javaworld/javatips/jw-javatip130.html – PeterMmm

Antwort

17

Wenn man sich die Felder in der Quelle für BigDecimal sehen gibt es:

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

Der Kommentar für stringCache wird „verwendet, um die kanonische Zeichenfolgendarstellung zu speichern, wenn berechnet wird.“, So der Annahme, dass Sie don‘ t toString aufrufen wir werden das als null Bytes belassen, also insgesamt gibt es (8 + 4 + 4) = 16 Bytes + BigInteger in BigDecimal und 4 + 4 + 4 + 4 + 4 = 20 Bytes + mag für BigInteger. Also insgesamt 36 Bytes plus die Magnitude. Soweit ich sagen kann, ist die Größe immer die minimale Anzahl von Bits, die notwendig ist, um die ganze Zahl darzustellen, so dass für eine Zahl n Log2 (n) Bits benötigt werden, die in Ints umgewandelt werden können. So im Allgemeinen sollten Sie werden mit etwa:

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

(beachten Sie, dies beinhaltet nicht eine der anderen Objektdeskriptorabschnitt Overhead als Beispiel Link für Strings nicht, aber es sollte Ihnen einen guten Überblick geben.)

+0

Beachten Sie, dass 'stringCache' und 'intVal' Referenzzeiger haben (jvm impl abhängig 4 oder 8 Bytes). Erinnern Sie sich auch an den Min 12 Byte-Header-Overhead ('BigInteger' und 'BigDecimal', int []) und schließlich an 8 Byte, um alle Objektgrößen auszurichten (zu runden). –

+0

s/Cieling/Decke / – thisfred

3

Wenn Sie in die Interna von BigDecimal graben, werden Sie sehen, dass es eine kompakte Darstellung verwendet, wenn der Signifikand < = Long.MAX_VALUE ist. Daher kann die Speichernutzung abhängig von den tatsächlichen Werten variieren, die Sie repräsentieren.

+0

Was ist die kompakte Darstellung? –