Я пытаюсь выполнить рекурсивную операцию, используя произвольный десятичный масштаб.
Однако по мере повторения рекурсии требуемая точность также удваивается, поэтому ее необходимо обрезать определенного уровня.
Я нашел подходящий метод BigDecimal.multiply(BigDecimal, MathContext), но он оказался странно медленным, чем BigDecimal.multiply(BigDecimal) code>.
После проверки внутреннего кода я обнаружил, что BigDecimal.divideAndRound() является основной причиной низкой производительности. Это занимает так много времени?
Ниже приведен простой код, позволяющий оценить производительность.
public static void main(String[] args) {
BigDecimal b = new BigDecimal("0.4320843204893290423");
b = b.pow(20);
int times = 1000000;
MathContext context = new MathContext(100, RoundingMode.FLOOR);
BigDecimal[] arr = new BigDecimal[times];
BigDecimal a;
for (int i = 0; i < times; i++) { //59ms
a = b.multiply(b);
arr = a;
}
System.out.println(Arrays.stream(arr).mapToDouble(BigDecimal::doubleValue).sum());
for (int i = 0; i < times; i++) { //2542ms
a = b.multiply(b, context);
arr = a;
}
System.out.println(Arrays.stream(arr).mapToDouble(BigDecimal::doubleValue).sum());
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... imal-multi
Почему BigDecimal.multiply(BigDecimal, MathContext) медленнее, чем BigDecimal.multiply(BigDecimal)? ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Использование параллелизма в Java делает программу медленнее (в четыре раза медленнее!)
Anonymous » » в форуме JAVA - 0 Ответы
- 9 Просмотры
-
Последнее сообщение Anonymous
-