Java BigInteger 替代方案
Java BigInteger alternative
有没有办法通过缓存提高 BigInteger
性能?
当您对 BigInteger
进行操作时,它总是会创建一个新的 BigInteger
。例如,当您将两个大整数相乘时,会创建一个新的 BigInteger
来承载结果。我想使用 BigInteger
的一些可变版本,它将用结果更新其中一个字段。
我怀疑如果你能以某种方式做到这一点,你的算法的性能是否会提高,但主要原则是 BigInteger
是不可变的。您不能在不生成新实例的情况下对其执行操作,并且有充分的理由需要这种行为 - 也就是说,如果您有多个线程在单个 BigInteger
上操作,您可以放心,这些线程不会直接覆盖 BigInteger
*.
如果您不希望这种行为,您唯一的选择是创建一个新的 class,但请记住,您仍将处理 BigInteger
s 在 一些层.
*:你知道,只要你不重新分配变量...
除非您想做的只是添加,否则您所要求的不太可能以任何方式提高性能。这样做的原因是几乎所有数学运算的结果中的位数(除了前面提到的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 的压力。您真的应该对您的应用程序进行基准测试,看看这是否值得付出努力。
有没有办法通过缓存提高 BigInteger
性能?
当您对 BigInteger
进行操作时,它总是会创建一个新的 BigInteger
。例如,当您将两个大整数相乘时,会创建一个新的 BigInteger
来承载结果。我想使用 BigInteger
的一些可变版本,它将用结果更新其中一个字段。
我怀疑如果你能以某种方式做到这一点,你的算法的性能是否会提高,但主要原则是 BigInteger
是不可变的。您不能在不生成新实例的情况下对其执行操作,并且有充分的理由需要这种行为 - 也就是说,如果您有多个线程在单个 BigInteger
上操作,您可以放心,这些线程不会直接覆盖 BigInteger
*.
如果您不希望这种行为,您唯一的选择是创建一个新的 class,但请记住,您仍将处理 BigInteger
s 在 一些层.
*:你知道,只要你不重新分配变量...
除非您想做的只是添加,否则您所要求的不太可能以任何方式提高性能。这样做的原因是几乎所有数学运算的结果中的位数(除了前面提到的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 的压力。您真的应该对您的应用程序进行基准测试,看看这是否值得付出努力。