JVM任意精度库

9
我正在开发一个项目(使用Scala),需要处理一些非常大的数字;这些数字远远超出了整型的表示范围。Java提供了BigInteger和BigDecimal类(Scala为它们提供了一个不错的薄包装器)。然而,我注意到这些库比我过去使用过的其他任意精度库(例如http://www.ginac.de/CLN/)慢得多,速度差异似乎大于仅归因于语言本身。
我对我的程序进行了一些分析,发现44%的执行时间花费在BigInteger乘法方法上。我想加快我的程序速度,所以正在寻找比BigInteger类(及其Scala包装器)更快、更高效的选项。我已经看过JScience的LargeInteger和Afloat的Aint。然而,两者似乎比标准的BigInteger类执行得更慢。
有没有人知道一个Java(或可用于JVM)的任意精度数学库,专注于高性能的整数乘法和加法?

这里似乎有一些不错的经验:https://dev59.com/xXVC5IYBdhLWcg3wfhKL - thoredge
谢谢。然而,我已经看到了这个问题,并尝试了JScience和AFloat库(正如我所说,它们似乎比BigInteger慢)。这可能是因为我的数字在大小上处于黄昏区域(约1500位数)。无论如何,我知道操作速度可以更快(就像C++代码实现的那样)。除语言差异外,可变性(与不可变的Java实现相比)也可能发挥作用。 - nomad
2个回答

2

很抱歉来晚了,我只知道Apfloat库,它可用于C++和Java。 Apfloat-Library:


1

很遗憾,我认为你没有Java本地库的运气。我没有找到一个。我建议使用JNI包装GMP,它具有出色的任意精度性能。虽然有JNI开销,但如果您处于1500位数字范围内,那么与算法复杂度的差异相比,这应该是微不足道的。您可以在Java中找到各种GMP包装(我认为最受欢迎的是这里)。


谢谢Rex。我会接受这个答案,因为它看起来很可靠。然而,由于我正在创建大量的大整数,JNI开销和JVM/本地对象分配实际上正在拖慢我的速度;导致性能比Java的BigInteger还要差。 - nomad
@nomad - 你需要重用整数。GMP可以做到这一点,而Scala可以为您提供更新并返回左侧参数操作,以在某种程度上帮助重用问题。请参阅使用GMP的计算机语言基准测试程序“pidigits”的Scala程序,以了解如何执行此操作。(我不保证这是最优雅的方法,但至少有一定可行性。) - Rex Kerr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接