Java - Язык:Как виртуальная машина обрабатывает 64-битную `длину` на 32-битном процессоре

StackOverflow https://stackoverflow.com/questions/237309

  •  04-07-2019
  •  | 
  •  

Вопрос

Как JVM обрабатывает примитивный "long", который равен 64 битам, на 32-битном процессоре?


Может ли он параллельно использовать несколько ядер на многоядерной 32-битной машине?
Насколько медленнее выполняются 64-битные операции на 32-битной машине?

Это было полезно?

Решение

Он может использовать несколько ядер для запуска разных потоков, но он не использует их параллельно для 64-разрядных вычислений.64-битный файл в основном хранится в виде двух 32-битных целых чисел.Чтобы добавить их, необходимы два дополнения, отслеживающие бит переноса.Умножение похоже на умножение двух двузначных чисел, за исключением того, что каждая цифра находится в базе 2 ^ 32 вместо базы 10.Так далее для других арифметических операций.

Редактировать о скорости:Я могу только догадываться о разнице в скорости.Сложение требует двух сложений вместо одного, а умножение (я думаю) потребовало бы четырех умножений вместо одного.Однако я подозреваю, что если бы все можно было хранить в регистрах, то фактическое время вычисления было бы незначительным по сравнению со временем, необходимым для двойного обращения к памяти для чтения и дважды для записи, так что, по моим предположениям, для большинства операций это примерно в два раза больше.Я предполагаю, что это будет зависеть от процессора, конкретной реализации JVM, фазы луны и т.д.Если вы не занимаетесь тяжелым перебором чисел, я бы не стал беспокоиться об этом.Большинство программ тратят большую часть своего времени на ожидание ввода-вывода на диск или из сети.

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

От Говорящее дерево, и в Часто ЗАДАВАЕМЫЕ ВОПРОСЫ о Java HotSpot:

Как правило, преимущества возможности обрабатывать большие объемы памяти связаны с небольшой потерей производительности на 64-разрядных виртуальных машинах по сравнению с запуском того же приложения на 32-разрядной виртуальной машине.Это связано с тем, что каждый собственный указатель в системе занимает 8 байт вместо 4.Загрузка этих дополнительных данных влияет на использование памяти, что приводит к несколько более медленному выполнению в зависимости от того, сколько указателей загружается во время выполнения вашей Java-программы.
Хорошей новостью является то, что с платформами AMD64 и EM64T, работающими в 64-разрядном режиме, виртуальная машина Java получает некоторые дополнительные регистры, которые она может использовать для генерации более эффективных последовательностей собственных команд.Эти дополнительные регистры повышают производительность до такой степени, что при сравнении 32- и 64-разрядной скорости выполнения зачастую потери производительности вообще нет.

Разница в производительности при сравнении приложения, работающего на 64-разрядной платформе, с 32-разрядной платформой на SPARC составляет порядка 10-20% при переходе на 64-разрядную виртуальную машину.На платформах AMD64 и EM64T эта разница составляет от 0-15% в зависимости от количества обращений к указателю, выполняемых вашим приложением.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top