Альтернатива Java BigInteger
Есть ли альтернатива для использования BigInteger в java?
Когда вы выполняете операцию в BigInteger, это всегда приводит к созданию нового BigInteger. Существует ли альтернативная реализация, когда результат некоторой операции между двумя большими целыми значениями сохраняется в одном из них?
Например, в Java, когда вы выполняете умножение двух больших целых чисел: a * b
создается новый BigInteger для размещения результата. Я хочу сохранить результат в a
.
Я хочу это, чтобы увеличить производительность в некоторых случаях моего алгоритма
Ответы
Ответ 1
Существуют измененные "версии" BigInteger
(например: https://github.com/bwakell/Huldra), или вы можете перевернуть свои собственные. Использование изменяемого объекта может уменьшить давление на GC. Вы действительно должны проверить свое приложение, чтобы убедиться, что это стоит усилий.
Ответ 2
Я сомневаюсь, что производительность вашего алгоритма улучшится, если вы сможете как-то это сделать, но основной принцип заключается в том, что BigInteger
является неизменным. Вы не можете выполнить операцию над ним, не создавая новый экземпляр, и есть веские причины для этого поведения, а именно, если у вас несколько потоков, работающих на одном BigInteger
, вы можете быть уверены, что эти потоки не переписывают это BigInteger
напрямую *.
Если вы не желаете этого поведения, единственным вариантом является создание нового класса, но имейте в виду, что вы все равно будете иметь дело с неизменностью BigInteger
на некотором уровне.
*: Знаете, до тех пор, пока вы не переназначаете переменную...
Ответ 3
То, о чем вы просите, вряд ли будет более впечатляющим, если только вы не захотите сделать это. Причина этого в том, что количество бит в результате почти любой математической операции (отличной от вышеупомянутой add
) отличается от исходного числа. Вы почти всегда должны выделять новый номер результатов и копировать его по оригиналу, так что все, что вы делаете, делает его медленнее.
Если, однако, все, что вам нужно сделать, это add/sub, то это выполнимо и на самом деле может быть немного быстрее, поскольку не будет выделение нового массива для добавления.
Почти все другие функции будут лучше делегированы классу BigInteger.
class MutableBigInteger {
BigInteger n;
public MutableBigInteger add (MutableBigInteger n) {
this.n = this.n.add(n.n);
return this;
}
}