Как использование BigDecimal влияло бы на производительность приложения?

Магическое число прибывает из систем типов UNIX, где первые несколько байтов файла содержали маркер, указывающий на тип файла.

Python помещает подобный маркер в pyc файлы, когда он создает их.

Затем интерпретатор Python удостоверяется, что это число корректно при загрузке его.

Что-либо, что повреждает это магическое число, вызовет Вашу проблему. Это включает редактирование pyc файл или попытка работать pyc от другой версии Python (обычно позже), чем Ваш интерпретатор.

, Если они Ваш pyc файлы, просто удалите их и позвольте интерпретатору перекомпилировать эти py файлы. В системах типов UNIX, которые могли быть чем-то столь же простым как:

rm *.pyc

или:

find . -name '*.pyc' -delete

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

Одна вещь, которая могла бы вызывать неустойчивую природу. pyc это вызывает проблему, может только быть импортирован при определенных условиях. Очень маловероятно, что это иногда импортировало бы. Необходимо ли проверить фактическое полное отслеживание стека, когда импорт перестал работать?

Как в стороне, первое слово весь моего 2.5.1(r251:54863) pyc файлы 62131, 2.6.1(r261:67517) 62161. Список всех магических чисел может быть найден в [1 116], воспроизведен здесь для полноты (текущий как, в то время, когда ответ был отправлен, это, возможно, изменилось с тех пор):

1.5:   20121
1.5.1: 20121
1.5.2: 20121
1.6:   50428
2.0:   50823
2.0.1: 50823
2.1:   60202
2.1.1: 60202
2.1.2: 60202
2.2:   60717
2.3a0: 62011
2.3a0: 62021
2.3a0: 62011
2.4a0: 62041
2.4a3: 62051
2.4b1: 62061
2.5a0: 62071
2.5a0: 62081
2.5a0: 62091
2.5a0: 62092
2.5b3: 62101
2.5b3: 62111
2.5c1: 62121
2.5c2: 62131
2.6a0: 62151
2.6a1: 62161
2.7a0: 62171
13
задан vtrubnikov 9 September 2009 в 20:08
поделиться

5 ответов

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

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

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

13
ответ дан 1 December 2019 в 20:00
поделиться

BigDecimal действительно имеет производительность намного ниже, чем, скажем, long , double или даже Long . Будет ли это иметь существенное значение для производительности вашего приложения, зависит от вашего приложения.

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

5
ответ дан 1 December 2019 в 20:00
поделиться

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

Я бы порекомендовал построить макет того, что вы хотите сделать, и измерить это. Это будет стоить намного больше, чем любые «теоретические» ответы, которые вы можете получить: -)

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

7
ответ дан 1 December 2019 в 20:00
поделиться

Большой вопрос: действительно ли вам нужны десятичные вычисления произвольной точности? Если вычисления выполняются только для анализа данных и принятия решений на их основе, то артефакты округления и двоичного представления среди наименее значимых битов, вероятно, не имеют отношения к вам; просто используйте double (и проанализируйте свои алгоритмы на числовую стабильность ).

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

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

3
ответ дан 1 December 2019 в 20:00
поделиться

Я не уверен, каковы ваши требования, но обычно при выполнении финансовых расчетов нельзя допустить снижения точности, вызванного типами с плавающей запятой. Обычно при работе с деньгами точность и правильное округление важнее эффективности.
Если вам не нужно иметь дело с процентами и все суммы являются целыми числами, вы можете использовать целые типы (int, long или даже BigInteger) с одним значением 0,01 вашей денежной единицы.
И даже если вы думаете, что можете позволить себе точный удар с типом double , возможно, стоит сначала попробовать с BigDecimal и проверить, действительно ли он тормозит для вас.

1
ответ дан 1 December 2019 в 20:00
поделиться
Другие вопросы по тегам:

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