2012-04-26 11 views
10

Sto lavorando a un progetto (in Scala), in cui ho bisogno di manipolare alcuni numeri molto grandi; troppo grande per essere rappresentato dai tipi interi. Java fornisce le classi BigInteger e BigDecimal (e scala fornisce un bel wrapper sottile intorno a loro). Tuttavia, ho notato che queste librerie sono sostanzialmente più lente di altre librerie di precisione arbitrarie che ho usato in passato (ad esempio http://www.ginac.de/CLN/) e la differenza di velocità sembra più grande di quella che può essere attribuita alla sola lingua.Librerie di precisione arbitrarie JVM

Ho eseguito alcuni profili del mio programma e il 44% del tempo di esecuzione è stato speso nel metodo di moltiplicazione BigInteger. Mi piacerebbe velocizzare il mio programma un po ', quindi sto cercando un'opzione più veloce ed efficiente della classe BigInteger (e del suo wrapper Scala). Ho esaminato LargeInteger (da JScience) e Aint (da Afloat). Tuttavia, entrambi sembrano eseguire più lentamente rispetto alla classe BigInteger standard.

Qualcuno sa di una libreria matematica di precisione arbitraria Java (o disponibile sulla JVM) con un focus sulla moltiplicazione e l'aggiunta di interi ad alte prestazioni?

+0

Sembra che ci sia un qualche buona esperienza qui http://stackoverflow.com/questions/277309/java-floating-point-high-precision-library – thoredge

+0

Grazie. Tuttavia, ho visto questa domanda e ho provato entrambe le librerie JScience e AFloat (che, come ho detto, sembrano essere più lente di BigInteger). Ciò potrebbe essere dovuto al fatto che i miei numeri si trovano nella zona crepuscolare in termini di dimensioni (circa 1500 cifre). Ad ogni modo, so che le operazioni possono essere molto più veloci (come il codice C++ ha ottenuto questo risultato). Oltre alla differenza linguistica, potrebbe anche essere in gioco la mutabilità (rispetto all'immutabile impli Java). – nomad

risposta

1

Sfortunatamente, penso che sei sfortunato per una libreria nativa Java. Non l'ho trovato. Raccomando di avvolgere GMP, che ha prestazioni di precisione arbitrarie eccellenti, usando JNI. Esiste un sovraccarico JNI, ma se ti trovi nell'intervallo di 1500 cifre, questo dovrebbe essere piccolo rispetto alla differenza nella complessità algoritmica. Puoi trovare vari pacchetti di GMP per Java (credo che il più popolare sia here).

+0

Grazie Rex. Accetterò questa risposta b/c sembra sana. Tuttavia, sembra che b/c sto creando un numero così grande di grandi numeri interi, l'overhead JNI e l'allocazione di oggetti JVM/nativi mi sta uccidendo davvero; risultando in prestazioni peggiori di quelle di Java BigInteger. – nomad

+0

@nomad - È necessario riutilizzare i numeri interi. GMP può farlo e Scala può darti operazioni di argomento di aggiornamento e restituzione a sinistra che possono in qualche modo aiutare il problema del riutilizzo. Vedi il programma Scala "pidigits" che usa GMP nel Computer Benchmark Game per avere un'idea di come farlo. (Non sostengo che questo sia il più elegante, ma è almeno in qualche modo realizzabile). –

2

Sono un po 'in ritardo ... beh conosco solo la libreria apfloat, disponibile sia in C++ che in Java. Apfloat-Library: