Java BigInteger 替代方案

Java BigInteger alternative

有没有办法通过缓存提高 BigInteger 性能?

当您对 BigInteger 进行操作时,它总是会创建一个新的 BigInteger。例如,当您将两个大整数相乘时,会创建一个新的 BigInteger 来承载结果。我想使用 BigInteger 的一些可变版本,它将用结果更新其中一个字段。

我怀疑如果你能以某种方式做到这一点,你的算法的性能是否会提高,但主要原则是 BigInteger 是不可变的。您不能在不生成新实例的情况下对其执行操作,并且有充分的理由需要这种行为 - 也就是说,如果您有多个线程在单个 BigInteger 上操作,您可以放心,这些线程不会直接覆盖 BigInteger*.

如果您不希望这种行为,您唯一的选择是创建一个新的 class,但请记住,您仍将处理 BigIntegers 在 一些层.

*:你知道,只要你不重新分配变量...

除非您想做的只是添加,否则您所要求的不太可能以任何方式提高性能。这样做的原因是几乎所有数学运算的结果中的位数(除了前面提到的add)与原始数字的大小不同。您将 几乎总是 必须分配新的结果数量并将其复制回原来的结果,所以您实际上所做的只是让它变慢。

但是,如果您需要做的只是 add/sub 那么这是可行的,而且实际上可能会更快一些,因为不会为添加分配新数组。

几乎所有其他功能最好委托给 BigInteger class。

class MutableBigInteger {
    BigInteger n;

    public MutableBigInteger add (MutableBigInteger n) {
        this.n = this.n.add(n.n);
        return this;
    }
}

那里有 BigInteger 的可变 "versions"(例如:https://github.com/bwakell/Huldra),或者您可以自己推出。使用可变对象可以减轻 GC 的压力。您真的应该对您的应用程序进行基准测试,看看这是否值得付出努力。