2010-03-23 18 views
17

Czy istnieje wskazówka do oszacowania ilości pamięci zużytej przez BigDecimal?Użycie pamięci Java BigDecimal?

Szukasz czegoś podobnego do tych guidelines do oszacowania wykorzystania pamięci w postaci String.

+0

Tak samo z większą stałą. Oczywiście, jak 'String', jest to zależne od implementacji. –

+0

Czy przeczytałeś ten: http://www.javaworld.com/javaworld/javatips/jw-javatip130.html – PeterMmm

Odpowiedz

17

Jeśli spojrzeć na polach w źródle dla BigDecimal jest:

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

Komentarz do stringCache jest „używany do przechowywania kanoniczną reprezentację ciąg, czy obliczona.”, Więc przy założeniu, że don” t call toString zostawiamy to jako zero bajtów, więc w sumie są (8 + 4 + 4) = 16 bajtów + BigInteger w BigDecimal i 4 + 4 + 4 + 4 + 4 = 20 bajtów + mag dla BigInteger. Łącznie 36 bajtów plus magnitudo. O ile mogę powiedzieć, wielkość jest zawsze minimalna liczba bitów niezbędnych do reprezentowania pełnej liczby całkowitej, więc dla liczby n będzie potrzebować log2 (n) bitów, które mogą być konwertowane na ints. Tak w ogóle powinien być używany o:

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

(Uwaga ta nie obejmuje żadnej z drugiej napowietrznej obiekt deskryptora jako link przykład dla strun ma, ale powinno dać dobry ogólny pomysł.)

+0

Należy pamiętać, że 'stringCache' i 'intVal' będą miały wskaźniki odniesienia (zależne od 4 lub 8 jvm impl). Zapamiętaj również nagłówek nagłówka o min. 12bajtach ("BigInteger" i "BigDecimal", int []), a na końcu 8-bajtowe wyrównanie (zaokrąglenie w górę) wszystkich rozmiarów obiektów. –

+0

s/Cieling/Ceiling / – thisfred

3

Jeśli zagłębisz się w wnętrzach BigDecimal zobaczysz, że używa on zwartej reprezentacji, jeśli znacznik jest < = Long.MAX_VALUE. Dlatego użycie pamięci może się różnić w zależności od rzeczywistych wartości, które reprezentujesz.

+0

Co to jest zwarta reprezentacja? –