Лучший примитивный тип для быстрого сравнения чисел?

У меня есть функция, которая выполняет несколько сотен миллионов итераций, пытаясь найти оптимальную комбинацию заданного набора возможностей. Все мои данные предварительно рассчитаны, и почти вся арифметика представляет собой простое сравнение >= или <= этих предварительно рассчитанных значений.

Мне интересно, есть ли преимущество в использовании определенных примитивных типов (int, long, double) при проведении этого простого сравнения.

Я знаю, что могу пойти и провести тест, чтобы увидеть, какой из них «лучший», но также важно понимать основную аргументацию. Например, возможно, int легче всего сопоставить, потому что он занимает меньше памяти, или, возможно, с плавающей запятой double легче узнать, какая степень 10 это значение, что в некоторых случаях ускоряет сравнение. Мне интересно знать эти основы, и простой тест мне этого не скажет.

Зависит от вашего варианта использования и от того, хотите ли вы иметь дело с переполнением.

Jacob G. 30.06.2018 18:24

сначала сделайте то, что правильно, затем измерьте, а затем измените что-нибудь, если это вообще необходимо.

gagan singh 30.06.2018 18:25

@JacobG. что значит переполнение? Нравится превзойти Integer.MAX_VALUE? Все предварительно рассчитано, поэтому я мог подавить переполнение, уменьшив значения до желаемой степени 10, чтобы полностью избежать переполнения.

Kael Eppcohen 30.06.2018 18:26
"Преждевременная оптимизация - корень всех зол. *" - Дональд Эрвин Кнут
Turing85 30.06.2018 18:27

Это зависит от вашей JVM, операционной системы, процессора. Как вы уже предположили, да, пойдите и проверьте в своей конкретной среде.

mentallurg 30.06.2018 18:27

@ Turing85 спасибо за -1, полагаю. Оптимизация не всегда преждевременна, как здесь.

Kael Eppcohen 30.06.2018 18:29

@KaelEppcohen Ваше предположение неверно. Если вы определили, что у вас проблема с производительностью, поделитесь соответствующим кодом, а также (важными) данными о производительности вместо того, чтобы представлять частичное решение, чтобы избежать XY-проблема

Turing85 30.06.2018 18:29
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
43
1

Ответы 1

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

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

  • Коэффициент попадания в кеш - доступ к памяти в несколько раз медленнее, чем доступ к кэшированному значению. Реструктуризация циклов при доступе к большим массивам данных может значительно ускорить вашу программу без изменения количества необработанных сравнений, выполняемых вашей программой.
  • Прогнозы ветвей - очень важно поддерживать конвейер ЦП в рабочем состоянии. Если ваши циклы и ваши данные структурированы таким образом, чтобы оптимизировать количество правильных предсказаний ветвлений, ваш код работает намного быстрее, чем код с большим количеством неверных предсказаний ветвлений.

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

Другие вопросы по теме