Почему
result += Double.parseDouble(numberAsString)
с result
примитивом double
, медленнее
result = result.add(new BigDecimal(numberAsStrings))
с result
, являющимся BigDecimal
?
Тесты:
@Setup
public void beforeEach() {
numbersAsStrings = new String[NUMBER_COUNT];
double currentNumber = 1;
for (int i = 0; i < NUMBER_COUNT; i++) {
numbersAsStrings[i] = String.valueOf(currentNumber);
currentNumber += 0.1;
}
}
@Benchmark
public double addUpDoublesParsedFromString() {
double result = 0;
for (int i = 0; i < numbersAsStrings.length; i++) {
result += Double.parseDouble(numbersAsStrings[i]);
}
return result;
}
@Benchmark
public BigDecimal addUpBigDecimalsFromString() {
BigDecimal result = new BigDecimal(0);
for (int i = 0; i < numbersAsStrings.length; i++) {
result = result.add(new BigDecimal(numbersAsStrings[i]));
}
return result;
}
Поскольку примитивы обычно имеют репутацию вычислений быстрее, чем не примитивырезультаты поразительны (по крайней мере для меня):
Benchmark Mode Samples Score Score error Units
t.n.b.n.BigDecimalVsDouble.addUpDoublesParsedFromString thrpt 4 484.070 59.905 ops/s
t.n.b.n.BigDecimalVsDouble.addUpBigDecimalsFromString thrpt 4 1024.567 170.329 ops/s
Это 1024,567 операций / с для добавления BigDecimals, но только 484,070 операций / с для добавления с использованием примитива (тестируется в JMH).
Почему это так?Если есть способ оптимизировать добавление double
примитивов, анализируемых из строк, со скоростью, превышающей BigDecimal
, укажите это в своем ответе.