【问题标题】:Does Java 64 bit perform better than the 32-bit version?Java 64 位的性能是否优于 32 位版本?
【发布时间】:2010-10-09 23:56:39
【问题描述】:

我注意到Sun 提供了 64 位版本的 Java。它的性能是否比 32 位版本更好?

【问题讨论】:

    标签: java 64-bit 32-bit


    【解决方案1】:

    几乎总是 64 位会更慢。

    HotSpot FAQ引用孙:

    性能差异比较 在 64 位上运行的应用程序 平台与 32 位平台 SPARC 约为 10-20% 迁移到 64 位时的降级 虚拟机。在 AMD64 和 EM64T 平台上,这 差异范围为 0-15%,具体取决于 关于指针访问量 您的应用程序执行。

    链接中有更多详细信息。

    【讨论】:

    • 在 x86_64 上几乎总是更快,如上段所示
    【解决方案2】:

    定义您的工作量以及“执行”对您意味着什么。

    作为一个长期存在的性能极客,这对我来说是一种持续的烦恼。特定更改是否“表现更好”首先取决于工作量,即您要求程序执行的操作。

    64 位 Java 通常在计算负载繁重的情况下表现更好。 Java 程序通常具有繁重的 I/O 负载和繁重的网络负载; 64 位与 32 位可能无关紧要,但操作系统通常会这样做。

    【讨论】:

    • 不敢相信答案这么简单。对我来说,64 位更适合负载,其中 64 位地址空间是帮助而不是障碍。每个指针都有 2 倍的成本,如果您需要大量数据,这可能会被超过。 Web 服务器对象缓存是 64 位获胜的一个很好的例子。
    • Darron,你有引用吗?由于我在 Sun 工作了 10 年,并且由于答案基本上是“这取决于工作量以及您关心测量什么样的性能”,所以我 - 怎么说 - 不相信你。
    • @Charlie Martin:请参阅 java.sun.com/docs/hotspot/HotSpotFAQ.html#64bit%5Fperformance 上的 HotSpot 常见问题解答
    • 我怀疑原因是大多数时候对象大小的增加(因为指针大小)淹没了对 long 和 double 进行更有效操作的好处。
    • 好的,我知道你是怎么做到的,但它仍然归结为 64 位在 一些 工作负载上表现更好,更差 在其他人,这是对其他人的洗礼。换句话说,“首先取决于工作量”。
    【解决方案3】:

    如果您需要超过 1.2 GB 的空间,64 位的性能会更好。在某些平台上,您最多可以获得 3 GB,但如果您想要 4 - 384 GB,例如,64 位是您唯一的选择。

    我相信 Azul 支持 384 GB 的 JVM,有没有人知道你是否可以更高?

    【讨论】:

    • 1.2GB 还是什么?内存?
    • @johnny 是的,在 32 位 Windows 系统上需要 1.2 GB 内存。
    【解决方案4】:

    我知道这个问题已经很老了,并且投票的答案在编写时可能是正确的。但现在生活在 2018 年,情况发生了变化。

    我刚刚在 Java 8 32 位 JVM 上运行在 Win 10 64 位上的 Java 客户端应用程序出现问题。它在 26 秒内HttpsURLConnectionInputStream 读取 174 MB 数据,这非常慢。事实证明,服务器和网络不是造成这种情况的原因。

    想到“嘿,32 位和 64 位 JRE 之间不可能有很大的区别”,我花了一些时间才尝试让 64 位 JVM 执行完全相同的代码。幸运的是,最后我做到了:它在 5 秒内读取了相同的 174MB

    我不知道我是否可以让它更快,但关键是:

    • jre1.8.0_172 32Bit:6.692MB/s
    • jre1.8.0_172 64Bit:34.8MB/s

    对于在 Windows 10 64Bit 上执行的非常相同 jar 文件。

    我不知道这可能是什么原因,但我可以通过“是的,64 位 Java 比 32 位 Java 更好”来回答这个问题。有关此问题,另请参阅 the answer of my question 中的数字。

    【讨论】:

      【解决方案5】:

      在大多数 CPU 架构上,32 位比 64 位快,其他条件相同。 64 位指针传输所需的带宽是 32 位的两倍。然而,x64 指令集架构比 x86 增加了一点理智,因此它最终变得更快。 long 类型的处理量通常很小。

      当然这也取决于Java的实现。与编译器一样,您可能会发现实现中的差异;例如,NIO 假定使用 64 位指针。另请注意,Sun 以前只为 x64 提供了更快的服务器 HotSpot 实现。这意味着如果您指定 -d64,您还将从客户端切换到服务器 HotSpot,IIRC。

      【讨论】:

        【解决方案6】:

        一些改进:64 位双精度运算的计算速度与 32 位浮点运算一样快,以及与 int 相比,64 位长整数运算的计算速度一样快。

        因此,如果您正在运行包含大量 long 的代码,您可能会看到真正的改进。

        【讨论】:

          【解决方案7】:

          我的经验与其他答案不同。

          Java 64 位可能比 32 位更快。至少在我的测试中总是如此!当使用少于 4GB 时,指针参数无效,因为 64 位 VM 也将在内部使用短指针。但是,您将获得更快的 64 位 CPU 指令集!

          我在 Windows 7 和 JDE1.8.0_144 上对此进行了测试,但可能真正的原因是内部 JVM 设置不同。当您使用 64 位 JVM 时,它以“服务器”模式启动,而 32 位 VM 以“客户端”模式启动。

          【讨论】:

            【解决方案8】:

            是的,特别是如果您的代码是针对 64 位平台构建的。

            【讨论】:

              猜你喜欢
              • 2010-12-03
              • 2011-02-28
              • 2010-11-27
              • 2021-07-08
              • 1970-01-01
              • 2020-10-28
              • 1970-01-01
              • 2021-12-19
              • 2012-02-15
              相关资源
              最近更新 更多