Что сделать с производительностью Java BigDecimal?

Что касается вашего примера, вам не нужно выходить из pdb и изменять код. Вы можете войти в функцию (с 's') и установить weekday_index = 0 внутри.

Одним из решений вашей исходной проблемы является использование команды перехода отладчика следующим образом:

  1. перед вызовом функции, используя шаг 'j # line-number'
  2. в функции с 's'
  3. , установите параметры ввода и продолжите отладку.

Это сработало, когда я попробовал, но отладчик жаловался, когда я попытался сделать шаг 3 до шага 2 по какой-то причине.

59
задан Elijah 24 April 2009 в 09:34
поделиться

14 ответов

Можно ли быть, должен запуститься с замены = (1/b) * c с = c/b? Это не 10x, но тем не менее что-то.

На вашем месте, я создал бы свой собственный класс Деньги, которые сохранят длинные доллары и длинные центы, и сделают математику в ней.

36
ответ дан Vladimir Dyuzhev 7 November 2019 в 14:52
поделиться

Имел подобную проблему к этому в торговой системе акции назад в 99. В очень запускаются дизайна, мы принимаем решение иметь каждое число в системе, представленной, как длинное, умноженное на 1000000 таким образом 1.3423, было 1342300L. Но основной драйвер для этого был следом памяти, а не производительностью прямой линии.

Одно слово на осторожности, я не сделал бы этого снова сегодня, если я не был действительно уверен, что математическая производительность была супер очень важна. В большинстве веб-приложений стандарта трясины издержки jdbc доступа и доступа к другим болотам сетевых ресурсов любое преимущество наличия действительно быстрой математики.

0
ответ дан Gareth Davis 7 November 2019 в 14:52
поделиться

Возможно, необходимо ли изучить получение аппаратно ускоренных десятичных систем счисления?

http://speleotrove.com/decimal/

0
ответ дан John Nilsson 7 November 2019 в 14:52
поделиться

Действительно ли JNI является возможностью? Можно быть в состоянии восстановить некоторую скорость и потенциально усилить существующие собственные библиотеки фиксированной точки (возможно, даже некоторый SSE* совершенство также)

, Возможно http://gmplib.org/

0
ответ дан basszero 7 November 2019 в 14:52
поделиться

Можно ли обеспечить больше понимания относительно цели вычисления?

, Что Ваш контакт с является компромиссом между скоростью и точностью. Как большое желание потеря в точности быть, если Вы переключились на примитив?

я думаю в некоторых случаях, что пользователь может быть доволен меньшей точностью в обмен на скорость, пока они могут заточить в на точном вычислении при необходимости. Это действительно зависит от того, для чего Вы будете использовать это вычисление.

, Возможно, можно ли позволить пользователю предварительно просматривать результат быстро с помощью, удваивается, и затем запросите более точное использование значения BigDecimal, если они желают?

0
ответ дан Justin Standard 7 November 2019 в 14:52
поделиться

1/b не является точно представимым с BigDecimal также. См. документы API, чтобы разработать, как результат округлен.

не должно быть также трудно записать Ваш собственный фиксированный десятичный класс, базирующийся вокруг длинного поля или два. Я не знаю никого соответствующего от библиотек полки.

1
ответ дан Tom Hawtin - tackline 7 November 2019 в 14:52
поделиться

Какую версию JDK/JRE Вы используете?

Также Вы могли бы попробовать ArciMath BigDecimal, чтобы видеть если их скорости это для Вас.

Редактирование:

я не забываю читать где-нибудь (я думаю, что это был Эффективный Java), что класс BigDecmal был изменен от того, чтобы быть JNI, названным к библиотеке C ко всему Java в какой-то момент..., и это стало быстрее от этого. Таким образом, могло случиться так, что любая библиотека произвольной точности, которой Вы пользуетесь, не собирается получать Вас скорость, в которой Вы нуждаетесь.

2
ответ дан TofuBeer 7 November 2019 в 14:52
поделиться

Лично, я не думаю, что BigDecimal идеален для этого.

Вы действительно хотите реализовать свой собственный Денежный класс с помощью longs внутренне для представления самой маленькой единицы (т.е. цент, 10-й цент). Существует некоторая работа в этом, реализовывая add() и divide() и т.д., но это не действительно настолько твердо.

2
ответ дан SCdF 7 November 2019 в 14:52
поделиться

Я не забываю посещать представление продаж от IBM для аппаратно ускоренной реализации BigDecimal. Таким образом, если Ваша целевая платформа является System z IBM или Системой p, Вы могли бы использовать это беспрепятственно.

следующая ссылка могла бы быть несколько полезной.

http://www-03.ibm.com/servers/enable/site/education/wp/181ee/181ee.pdf

Обновление: Ссылка больше не работает.

3
ответ дан toolkit 7 November 2019 в 14:52
поделиться

Вы могли бы хотеть переместиться в математику фиксированной точки. Просто ища некоторые библиотеки прямо сейчас. на фиксированной точке sourceforge я подробно еще не посмотрел на это. beartonics

Вы тестировали с org.jscience.economics.money? так как это гарантировало точность. Фиксированная точка только будет так же точна как # битов, присвоенных каждой части, но быстра.

5
ответ дан sfossen 7 November 2019 в 14:52
поделиться

Сохраните longs как количество центов. Например, BigDecimal money = new BigDecimal ("4.20") становится long money = 420. Просто необходимо не забыть к модификации 100 получать доллары и центы для вывода. Если необходимо отследить, скажем, десятые части цента, это стало long money = 4200 вместо этого.

5
ответ дан Pesto 7 November 2019 в 14:52
поделиться

Принятие Вас может работать к некоторой произвольной, но известной точности (скажите, что одна миллиардная цента), и имеют известное максимальное значение, которое Вы должны обработать (триллион триллионов долларов?) можно записать класс, который хранит то значение как целое число миллиардных частей цента. Вам будут нужны два longs для представления его. Это должно быть, возможно, в десять раз более медленно, чем использующий дважды; приблизительно сто раз с такой скоростью, как BigDecimal.

большинство операций просто выполняет операцию на каждой части и перенормализацию. Подразделение немного более сложно, но не очень.

ответ EDIT:In на комментарий. Необходимо будет реализовать операцию сдвига разряда на классе (легкий как вперед, поскольку множитель для верхнего уровня долго является питанием два). Чтобы сделать подразделение смещает делитель, пока это не не совсем больше, чем дивиденд; вычтите сдвинутый делитель из дивиденда и увеличьте результат (с соответствующим сдвигом). Повториться.

РЕДАКТИРОВАНИЕ AGAIN:You может найти, что BigInteger делает то, в чем Вы нуждаетесь здесь.

9
ответ дан DJClayworth 7 November 2019 в 14:52
поделиться

Большинство двойных операций дает Вам более чем достаточно точности. Можно представить $10 триллионов с точностью цента с двойным, который может быть более чем достаточно для Вас.

Во всех торговых системах я продолжил работать (четыре различных банка), они использовали дважды с соответствующим округлением. Я не вижу оснований для использования BigDecimal.

15
ответ дан Peter Lawrey 7 November 2019 в 14:52
поделиться
Only 10x performance increase desired for something that is 1000x slower than primitive?!.

Добавление немного большего количества оборудования могло бы быть дешевле (учитывая вероятность наличия валюты погрешность расчета).

2
ответ дан 24 November 2019 в 18:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: