【问题标题】:Java's BigInteger implementationJava 的 BigInteger 实现
【发布时间】:2018-10-09 04:13:06
【问题描述】:

我是新来的,所以请原谅我的菜鸟错误。我目前正在从事我的一个小项目,该项目让我处理长度在四万及以上的数字。

我目前正在使用 BigInteger 来处理这些值,并且我需要一些性能更快的东西。我读过 BigInteger 在其实现中使用了一个整数数组,我需要知道 BigInteger 是使用该数组中的每个索引来表示每个小数点,如 1-9,还是使用更有效的东西.

我问这个是因为我已经想到了一个使用位操作的实现,这使得它更高效,内存和处理更明智。

所以最后一个问题是 - BigInteger 是否已经足够高效,我应该依赖它吗?最好知道这一点,而不是不必要地进行测试,这会花费很多时间。

谢谢。

【问题讨论】:

  • 很难说足够高效...您可以编写基准并进行比较。 stackoverflow.com/questions/504103/…
  • 您已经说过“我需要性能更快的东西” - 这是您的猜想,还是您证明BigInteger 还不够你? (我强烈怀疑您可以轻松想象的针对 BigInteger 的任何优化都已经存在。不过,您可以自己查看实现,例如在 hg.openjdk.java.net/jdk/jdk/file/957de5be48bc/src/java.base/…
  • 太多应用程序使用BigInteger,我怀疑即使是一小部分应用程序也有潜在的瓶颈
  • 感谢大家的回复。不,我没有做任何假设。我只需要知道。当然,我知道 BigInteger 和它们一样精致和复杂,但是当我读到一些关于数组的东西时,它让我想起了我在找到 BigInteger 类之前创建的一个旧的 superint 类。我正在做同一个项目,我直接开始制作我自己的最小 SuperInt,但它真的很慢,我想了一个改进,但那时我也找到了 BigInteger。所以这就是我的好奇心所在。
  • 在我有限的测试中,我没有发现任何比 Java 8+ BigInteger 更快的纯 Java big int 实现,包括声称它们更快的第三方类。 Java 8+ BigInteger 结合了高级算法,在足够大的操作数上进行乘法和除法运算时性能优于 O(n^2)。

标签: java biginteger


【解决方案1】:

至少对于 Oracle 的 Java 8 和 OpenJDK 8,它不会为每个 int 存储一位十进制数字。它将每个 32 位 int 的完整 32 位部分存储在 int[] 中,可以通过 its source code 看到。

位运算对它来说很快,因为它是一个符号幅度值,并且幅度按照您的预期打包存储,只需确保您使用 the relevant BigInteger bitwise methods 而不是自己实现。

如果您仍然需要更快的速度,请尝试GMP 之类的方法,但请注意它使用 LGPL 或 GPL 许可证。在 Java 之外使用它也会更好。

【讨论】:

  • 谢谢,我想我只关注 BigInteger。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
相关资源
最近更新 更多