Java: как виртуальная машина обрабатывает 64-битную "длину" на 32-битном процессоре - PullRequest
9 голосов
/ 26 октября 2008

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


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

Ответы [ 2 ]

8 голосов
/ 26 октября 2008

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

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

5 голосов
/ 26 октября 2008

С TalkingTree и Часто задаваемые вопросы по Java HotSpot :

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

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

...