JVM 如何在 32 位处理器上处理 64 位的原始“long”?
在多核 32 位机器上可以并行使用多核吗?
32 位机器上的 64 位操作要慢多少?
它可以使用多个内核来运行不同的线程,但它不会将它们并行用于 64 位计算。一个 64 位的长度基本上存储为两个 32 位的整数。为了添加它们,需要两个加法,跟踪进位位。乘法有点像将两个两位数相乘,除了每个数字的基数为 2^32 而不是基数 10。其他算术运算依此类推。
关于速度的编辑:我只能猜测速度差异。加法需要两次加法而不是一次,而乘法(我认为)需要四次乘法而不是一次。但是,我怀疑如果所有内容都可以保存在寄存器中,那么计算的实际时间将与两次读取和两次写入内存所需的时间相形见绌,所以我的猜测是大多数人的两倍操作。我想这将取决于处理器、特定的 JVM 实现、月相等。除非您进行大量的数字运算,否则我不会担心。大多数程序大部分时间都在等待与磁盘或网络之间的 IO。
来自TalkingTree和Java HotSpot FAQ:
通常,与在 32 位 VM 上运行相同的应用程序相比,能够处理大量内存的好处是 64 位 VM 的性能损失很小。这是因为系统中的每个本机指针占用 8 个字节而不是 4 个字节。这些额外数据的加载会影响内存使用,这取决于在执行期间加载了多少指针,这会导致执行速度稍慢你的 Java 程序。
好消息是,在 AMD64 和 EM64T 平台以 64 位模式运行时,Java VM 获得了一些额外的寄存器,可用于生成更高效的本机指令序列。这些额外的寄存器将性能提高到在比较 32 位和 64 位执行速度时通常根本没有性能损失的程度。将在 64 位平台上运行的应用程序与在 SPARC 上运行的 32 位平台进行比较,当您迁移到 64 位 VM 时,性能差异大约会下降 10-20%。在 AMD64 和 EM64T 平台上,此差异范围为 0-15%,具体取决于访问应用程序执行的指针数量。