Являются ли 64-разрядные целые числа менее эффективными, чем 32-разрядные целые числа в JVM? - PullRequest
0 голосов
/ 07 марта 2012

Фон: Я хочу хранить числа с точностью до 4 десятичных знаков без округления.Поэтому я подумал об использовании целых чисел внутри;например, 12.3456 внутренне представлен как 123456.Но с 32b целыми числами я могу считать от только до 214748 , что очень мало.

Я думаю, что 64-битные целые числа - это решение.Но являются ли операции с 64-разрядными целыми числами менее эффективными , чем у 32-разрядных целых чисел, если компьютер работает под управлением 64-разрядной виртуальной машины Java?(Solr), пакет оптимизации (Drools) и другие пакеты , написанные на Java , и они могут плохо работать с десятичным типом данных (если вы это предложите).

Ответы [ 3 ]

2 голосов
/ 07 марта 2012

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

Кроме того, ответ на на этот вопрос содержит более подробную информацию, но в основном "Это зависит от платформы". Это не обязательно верно, 64-битная будет медленнее, чем 32-битная.

1 голос
/ 07 марта 2012

Как правило, чем больше данных вам нужно перебрасывать, тем медленнее это происходит, поэтому даже на 64-битной виртуальной машине, придерживаясь int вместо long, в большинстве случаев быстрее.

Это становится очень понятным, если вы думаете с точки зрения использования памяти: массив 1 миллион ints требует 4MB, 1M long - 8MB.

Что касается скорости вычислений, есть некоторые накладные расходы для выполнения операций над 64-битными типами с 32-битными инструкциями. Но даже если виртуальная машина может использовать 64-битные инструкции (что должно быть на 64-битной виртуальной машине), в зависимости от процессора они все равно могут быть медленнее, чем их 32-битные аналоги (сложение / вычитание, вероятно, будет выполняться за один такт, но умножение и деление на 64-битные обычно медленнее, чем на 32-битные).


Очень распространенное заблуждение состоит в том, что целочисленная математика быстрее, чем математика с плавающей запятой. Как только вам понадобится выполнить дополнительные операции для «нормализации» ваших целых чисел, с плавающей запятой производительность вашей целочисленной реализации останется неизменной. Фактические различия в тактах, потраченных между целочисленными и с плавающей запятой, для большинства приложений незначительны, поэтому, если вам нужна плавающая точка, используйте ее и не пытайтесь эмулировать ее самостоятельно.

На вопрос, какой тип использовать на самом деле: Используйте тип, который наиболее подходит с точки зрения представления данных. Беспокойство о производительности, когда вы туда доберетесь. Посмотрите, какие операции вам нужно выполнить, и какую точность вам нужно. Затем выберите тип, который предлагает именно это. Судя по библиотекам, которые вы упомянули, победителем, вероятно, станет double.

1 голос
/ 07 марта 2012

Вероятно, это зависит от платформы.Я видел случаи, когда использование long вместо int примерно на 10% быстрее.64-разрядная JVM для Java 5.0 была примерно на 5% - на 10% медленнее, чем 32-разрядная JVM для Java 5.0.Java 6, похоже, не имеет этой проблемы.

Я думаю, что стоимость деления на 10000 намного превышает стоимость использования long вместо значения int.

Вы также можете использовать double, округляя результат до четырех десятичных знаков перед его печатью / выводом.

...