2012-04-26 19 views
10

Estoy trabajando en un proyecto (en Scala), donde tengo la necesidad de manipular algunos números muy grandes; demasiado grande para ser representado por los tipos integrales. Java proporciona las clases BigInteger y BigDecimal (y scala proporciona un buen envoltorio fino a su alrededor). Sin embargo, noté que estas bibliotecas son sustancialmente más lentas que otras bibliotecas de precisión arbitraria que he usado en el pasado (es decir, http://www.ginac.de/CLN/), y la diferencia de velocidad parece ser mayor que lo que se puede atribuir solo al lenguaje.Bibliotecas de Precisión Arbitrarias JVM

Hice algunos perfiles de mi programa, y ​​el 44% del tiempo de ejecución se está gastando en el método de multiplicación BigInteger. Me gustaría acelerar un poco mi programa, así que estoy buscando una opción más rápida y más eficiente que la clase BigInteger (y su envoltorio Scala). He consultado LargeInteger (de JScience) y Aint (de Afloat). Sin embargo, ambos parecen funcionar más lentamente que la clase estándar de BigInteger.

¿Alguien sabe de una biblioteca matemática de precisión arbitraria Java (o disponible en la JVM) con un enfoque en la multiplicación y suma de enteros de alto rendimiento?

+0

Parece que hay un poco de buena experiencia aquí http://stackoverflow.com/questions/277309/java-floating-point-high-precision-library – thoredge

+0

Gracias. Sin embargo, he visto esta pregunta y he intentado con las bibliotecas JScience y AFloat (que, como dije, parecen ser más lentas que BigInteger). Esto puede deberse a que mis números están en la zona crepuscular en términos de tamaño (~ 1500 dígitos). De cualquier manera, sé que las operaciones pueden ser mucho más rápidas (ya que el código C++ logró esto). Además de la diferencia de idioma, la mutabilidad (frente a las impls de Java inmutables) también podría estar en juego. – nomad

Respuesta

1

Lamentablemente, creo que no tiene suerte para una biblioteca nativa de Java. No he encontrado uno. Recomiendo encapsular GMP, que tiene un excelente rendimiento de precisión arbitraria, utilizando JNI. Hay sobrecarga de JNI, pero si estás en el rango de 1500 dígitos, eso debería ser pequeño en comparación con la diferencia en complejidad algorítmica. Puede encontrar varias envolturas de GMP para Java (creo que la más popular es here).

+0

Gracias Rex. Aceptaré esta respuesta b/c parece sonido. Sin embargo, parece que b/c estoy creando una cantidad tan grande de enteros grandes, la sobrecarga de JNI y la asignación de objeto JVM/nativo realmente me está matando aquí; lo que resulta en un rendimiento peor que el de BigInteger de Java. – nomad

+0

@nomad - Necesita reutilizar los enteros. GMP puede hacer esto, y Scala puede proporcionarle operaciones de actualización y retorno con el argumento de la izquierda que de alguna manera pueden ayudar a reutilizar el problema. Consulte el programa Scala "pidigits" que usa GMP en el Juego comparativo de idiomas de computadora para obtener una idea de cómo hacer esto. (No afirmo que este sea el más elegante, pero al menos es algo viable). –

2

Estoy un poco tarde ... bueno, solo conozco la biblioteca apfloat, disponible tanto en C++ como en Java. Apfloat-Library:

Cuestiones relacionadas