La creazione di nuovi oggetti è necessaria con BigDecimal?

0

Descrizione del problema:

Sto eseguendo il test delle prestazioni del calcolo del PI numero con primitives e con BigDecimal class.

Il calcolo di PI con le primitive è circa 5-6 volte più veloce dello stesso algoritmo, ma con BigDecimal di classe.

Vedo un problema con la creazione di new BigDecimal oggetto nel ciclo for , quando aggiungi valori - vedi codice completo con linea contrassegnata con commento.

Accessori di:

BigDecimal class ha 3 metodi che consente l'aggiunta

1.    public BigDecimal add(BigDecimal augend)
2.    public BigDecimal add(BigDecimal augend, MathContext mc)
3.    public static BigDecimal valueOf(long val) 

Quando si utilizzava il metodo BigDecimal#valueOf , il tempo di calcolo era ancora più grande della creazione dell'oggetto new .

Quindi, la domanda - è possibile aumentare le prestazioni del calcolo quando si utilizzano oggetti BigDecimal ?

    
posta DevDio 09.09.2017 - 20:53
fonte

1 risposta

2

BigDecimal è basato su una rappresentazione decimale di numeri frazionari e questa non è la rappresentazione naturale per un computer digitale (a Java manca qualcosa come BigBinaryFractional). D'altra parte, double è un tipo di dati binario direttamente supportato da tutte le moderne CPU. Questa è la prima parte della differenza di prestazioni.

Nelle linee

        double i2 = 4 * (pow / i1);
        pi = pi.add(new BigDecimal(i2));

mischiate rappresentazioni doppie e BigDecimal, che richiedono conversioni che rallentano ulteriormente il codice.

Ovviamente, double è una primitiva, mentre BigDecimal è un tipo di riferimento, quindi c'è un sovraccarico nella creazione di oggetti e nella successiva garbage collection.

Quindi, sono positivamente sorpreso che la differenza sia solo un fattore di 5.

    
risposta data 09.09.2017 - 21:52
fonte

Leggi altre domande sui tag