#java #biginteger
#java #biginteger
Вопрос:
Проблема
Пытался выполнить следующую возможную оптимизацию в своем коде. (Обновление: вычитание выполняется медленнее, что имеет смысл, поскольку это более сложная процедура).
Код:
if (bigK.compareTo(prevLevelChildrenCount) > 0)
Для
if (bigK.subtract(prevLevelChildrenCount).signum() == 1)
Скорость (вычитание против сравнения) при повторном использовании 100 000 000 раз для случайных чисел.
Вопрос:
Является ли поведение biginteger одинаковым при использовании вычитания как целого числа в терминах переполнений?
Я нашел следующий вопрос, но учтите, что это не дубликат, потому что biginteger не имеет тех же ограничений, что и integer. Но разделяет ли это проблему переполнения?
Комментарии:
1. @Джаррод Роберсон Это для biginteger. Это не совсем дубликат, поскольку те же ограничения / условия не применяются. Такое же ли поведение с точки зрения переполнений?
2. Возможно, было бы полезно, если бы вы пояснили, что
bigK
иprevLevelChildrenCount
являетсяBigInteger
. Когда вы говорите,I am comparing two positive big integers
немного неясно, оBigInteger
или большихint
значениях вы говорите.3.
Both
title
, иtag
включают словоBigInteger
. Также добавит в код.4. Приношу извинения. Я беру все свои слова обратно. Поскольку в документе для
BigInteger
содержится это утверждение, его можно использовать. Я просматривал документ дляComparable
, который отличается. Обратите внимание, что в документе дляBigInteger
которого предлагается использовать> 0
or< 0
в любом случае. В любом случае, то, что вы сделали, прекрасно.5. «Кажется, что Subtract работает быстрее» — как вы это тестировали? Если у вас нет надлежащего бенчмарка и вы не можете должным образом объяснить его результаты, вы выполняете преждевременную оптимизацию на основе субъективных наблюдений или предположений.
Ответ №1:
Есть причина, по которой я не должен этого делать? Я сравниваю два положительных больших целых числа?
Я не понимаю, почему вы не должны, сначала убедитесь, что это работает.
Какой из них должен быть быстрее? В моих собственных тестах subtract, похоже, работает быстрее.
Я бы не стал доверять тому, что один из них быстрее другого повсеместно. Помните, что микрооптимизация редко бывает продуктивной.
Является ли поведение biginteger таким же при использовании вычитания как целого числа в терминах переполнений.
Но разделяет ли это проблему переполнения?
Нет, BigInteger
переполнения не будет. Согласно связанному Javadoc,
Все детали в спецификации, касающиеся переполнения, игнорируются, поскольку BigIntegers делаются настолько большими, насколько это необходимо для размещения результатов операции.
Комментарии:
1. Так это эффективнее, чем использование compareTo? Или это зависит от используемых чисел и от того, какие биты установлены на что?
2. @maythesource.com Отредактировано. Остерегайтесь выполнения таких микрооптимизаций, это, вероятно, зависит от платформы, архитектуры и реализации. Кроме того, микро-тесты обычно ненадежны.
3. Спасибо как за ответ, так и за комментарий. Я вернусь к работе над более крупными алгоритмическими узкими местами — увлекся.