【发布时间】:2010-10-09 23:56:39
【问题描述】:
我注意到Sun 提供了 64 位版本的 Java。它的性能是否比 32 位版本更好?
【问题讨论】:
我注意到Sun 提供了 64 位版本的 Java。它的性能是否比 32 位版本更好?
【问题讨论】:
几乎总是 64 位会更慢。
从HotSpot FAQ引用孙:
性能差异比较 在 64 位上运行的应用程序 平台与 32 位平台 SPARC 约为 10-20% 迁移到 64 位时的降级 虚拟机。在 AMD64 和 EM64T 平台上,这 差异范围为 0-15%,具体取决于 关于指针访问量 您的应用程序执行。
链接中有更多详细信息。
【讨论】:
定义您的工作量以及“执行”对您意味着什么。
作为一个长期存在的性能极客,这对我来说是一种持续的烦恼。特定更改是否“表现更好”首先取决于工作量,即您要求程序执行的操作。
64 位 Java 通常在计算负载繁重的情况下表现更好。 Java 程序通常具有繁重的 I/O 负载和繁重的网络负载; 64 位与 32 位可能无关紧要,但操作系统通常会这样做。
【讨论】:
如果您需要超过 1.2 GB 的空间,64 位的性能会更好。在某些平台上,您最多可以获得 3 GB,但如果您想要 4 - 384 GB,例如,64 位是您唯一的选择。
我相信 Azul 支持 384 GB 的 JVM,有没有人知道你是否可以更高?
【讨论】:
我知道这个问题已经很老了,并且投票的答案在编写时可能是正确的。但现在生活在 2018 年,情况发生了变化。
我刚刚在 Java 8 32 位 JVM 上运行在 Win 10 64 位上的 Java 客户端应用程序出现问题。它在 26 秒内 从 HttpsURLConnection 的 InputStream 读取 174 MB 数据,这非常慢。事实证明,服务器和网络不是造成这种情况的原因。
想到“嘿,32 位和 64 位 JRE 之间不可能有很大的区别”,我花了一些时间才尝试让 64 位 JVM 执行完全相同的代码。幸运的是,最后我做到了:它在 5 秒内读取了相同的 174MB!
我不知道我是否可以让它更快,但关键是:
对于在 Windows 10 64Bit 上执行的非常相同 jar 文件。
我不知道这可能是什么原因,但我可以通过“是的,64 位 Java 比 32 位 Java 更好”来回答这个问题。有关此问题,另请参阅 the answer of my question 中的数字。
【讨论】:
在大多数 CPU 架构上,32 位比 64 位快,其他条件相同。 64 位指针传输所需的带宽是 32 位的两倍。然而,x64 指令集架构比 x86 增加了一点理智,因此它最终变得更快。 long 类型的处理量通常很小。
当然这也取决于Java的实现。与编译器一样,您可能会发现实现中的差异;例如,NIO 假定使用 64 位指针。另请注意,Sun 以前只为 x64 提供了更快的服务器 HotSpot 实现。这意味着如果您指定 -d64,您还将从客户端切换到服务器 HotSpot,IIRC。
【讨论】:
一些改进:64 位双精度运算的计算速度与 32 位浮点运算一样快,以及与 int 相比,64 位长整数运算的计算速度一样快。
因此,如果您正在运行包含大量 long 的代码,您可能会看到真正的改进。
【讨论】:
我的经验与其他答案不同。
Java 64 位可能比 32 位更快。至少在我的测试中总是如此!当使用少于 4GB 时,指针参数无效,因为 64 位 VM 也将在内部使用短指针。但是,您将获得更快的 64 位 CPU 指令集!
我在 Windows 7 和 JDE1.8.0_144 上对此进行了测试,但可能真正的原因是内部 JVM 设置不同。当您使用 64 位 JVM 时,它以“服务器”模式启动,而 32 位 VM 以“客户端”模式启动。
【讨论】:
是的,特别是如果您的代码是针对 64 位平台构建的。
【讨论】: