【问题标题】:Are 64 bit integers less efficient than 32 bit integers in the JVM?JVM 中 64 位整数的效率是否低于 32 位整数?
【发布时间】:2012-03-25 05:19:34
【问题描述】:

背景:我想存储精确到小数点后 4 位的数字,无需四舍五入。所以我想在内部使用整数;例如,12.3456 在内部表示为 123456。但是对于 32b 个整数,我只能数到 214748,这非常小。

我猜 64 位整数是解决方案。但是,在给定运行 64 位 JVM 的机器的情况下,涉及 64 位整数的操作是否效率低于 32 位


顺便说一句,我正在使用信息检索包 (Solr)、优化包 (Drools) 和其他包用 Java 编写,它们可能无法很好地处理十进制数据类型(如果你建议的话)。

【问题讨论】:

标签: java performance jvm 32bit-64bit


【解决方案1】:

即使速度较慢,我怀疑这会成为您系统的瓶颈。您很可能会在程序的其他部分遇到更严重的性能问题。

此外,this question 的答案提供了更多详细信息,但基本上是“它取决于平台。”。 64位不一定比32位慢。

【讨论】:

    【解决方案2】:

    这可能取决于平台。我见过使用long 而不是int 的情况大约快10%。 Java 5.0 的 64 位 JVM 比 Java 5.0 的 32 位 JVM 慢 5% - 10%。 Java 6 似乎没有这个问题。

    我认为除以 10000 的成本远远超过使用 long 而不是 int 值的成本。

    您也可以使用double,在打印/输出之前将结果四舍五入到小数点后四位。

    【讨论】:

      【解决方案3】:

      通常,您需要传输的数据越多,速度就越慢,因此即使在 64 位 VM 上坚持使用 int 而不是 long 在大多数情况下也会更快。

      如果您从内存占用的角度考虑,这一点会变得非常清楚:100 万个整数的数组需要 4MB,1M 长的数组需要 8MB。

      至于计算速度,使用 32 位指令对 64 位类型执行操作会有一些开销。但是即使 VM 可以使用 64 位指令(它应该在 64 位 VM 上),根据 CPU,它们可能仍然比 32 位对应物慢(加/减可能会在一个时钟内完成,但是64 位的乘法和除法通常比 32 位慢)。


      一个非常常见的误解是整数数学比浮点数学更快。一旦您需要执行额外的操作来“规范化”您的整数,浮点将在性能上击败您的整数实现。对于大多数应用程序而言,整数指令和浮点指令之间所用时钟周期的实际差异可以忽略不计,因此如果您需要浮点,请使用它,不要尝试自己模拟。

      对于实际使用哪种类型的问题:使用最适合数据表示的类型。当你到达那里时担心性能。查看您需要执行的操作以及您需要的精度。然后选择正好提供的类型。从您提到的库来看,double 可能会成为赢家。

      【讨论】:

      • 他提到他想使用压缩十进制来归档真正的 4 位精度,例如在 BigInteger 中,因为浮点数可能存在二进制舍入错误,例如在 0.5
      猜你喜欢
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      • 2013-02-25
      • 1970-01-01
      • 2012-09-19
      相关资源
      最近更新 更多