Сравнение больших чисел против subtract signnum()

#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. Спасибо как за ответ, так и за комментарий. Я вернусь к работе над более крупными алгоритмическими узкими местами — увлекся.