2012-04-26 15 views
10

Pracuję nad projektem (w Scali), w którym potrzebuję manipulować bardzo dużymi liczbami; zbyt duża, aby można ją było reprezentować za pomocą typów integralnych. Java zapewnia klasy BigInteger i BigDecimal (a scala zapewnia ładne cienkie opakowanie wokół nich). Zauważyłem jednak, że te biblioteki są znacznie wolniejsze niż inne dowolne biblioteki precyzyjne, z których korzystałem w przeszłości (tj. http://www.ginac.de/CLN/), a różnica prędkości wydaje się większa niż to, co można przypisać samemu językowi.JVM Arbitralne Precyzyjne Biblioteki

Zrobiłem profilowanie mojego programu, a 44% czasu wykonania zostało wydane w metodzie multiplikacji BigInteger. Chciałbym nieco przyspieszyć mój program, więc szukam szybszej i wydajniejszej opcji niż klasa BigInteger (i opakowanie Scala). Spojrzałem na LargeInteger (od JScience) i Aint (z Afloat). Jednak oba wydają się działać wolniej niż standardowa klasa BigInteger.

Czy ktoś wie o dowolnej bibliotece matematycznej precyzyjnej Javy (lub dostępnej w JVM) z naciskiem na mnożenie i dodawanie liczb całkowitych o wysokiej wydajności?

+0

Wydaje się być niektóre dobre doświadczenie tutaj http://stackoverflow.com/questions/277309/java-floating-point-high-precision-library – thoredge

+0

Dzięki. Jednak widziałem to pytanie i próbowałem zarówno bibliotek JScience, jak i AFloat (które, jak powiedziałem, wydają się wolniejsze niż BigInteger). Może to być spowodowane tym, że moje liczby znajdują się w strefie zmierzchu pod względem wielkości (~ 1500 cyfr). Tak czy siak, wiem, że operacje mogą być znacznie szybsze (jak osiągnął to kod C++). Oprócz różnicy językowej, zmienność (w przeciwieństwie do niezmiennych implikacji Java) również może być w grze. – nomad

Odpowiedz

1

Niestety, myślę, że nie masz szczęścia dla biblioteki macierzystej Java. Nie znalazłem. Polecam owijanie GMP, które ma doskonałą dowolną dokładność, używając JNI. Istnieje nadwyżka JNI, ale jeśli masz 1500 cyfr, to powinno być małe w porównaniu z różnicą w algorytmicznej złożoności. Możesz znaleźć różne opakowania GMP dla Java (uważam, że najbardziej popularnym jest opakowanie here).

+0

Dzięki Rex. Przyjmuję tę odpowiedź b/c wydaje się, że brzmi dobrze. Jednak wydaje mi się, że b/c tworzę tak dużą liczbę dużych liczb całkowitych, że obciążenie JNI i przydział JVM/natywnego obiektu faktycznie mnie tutaj zabija; powodując gorszą wydajność niż Java's BigInteger. – nomad

+0

@nomad - Musisz ponownie użyć liczb całkowitych. GMP może to zrobić, a Scala może dać ci operacje aktualizacji i powrotu do lewej strony, które mogą nieco pomóc w problemach z ponownym użyciem. Zobacz program "pidigits" Scala, który używa GMP w grze Benchmark z językiem komputerowym, aby dowiedzieć się, jak to zrobić. (Nie twierdzę, że jest to najbardziej eleganckie, ale jest co najmniej w pewnym sensie wykonalne). –

2

Trochę się spóźniam ... cóż, znam tylko bibliotekę apfloat, dostępną zarówno w językach C++, jak i Java. Apfloat-Library: