【问题标题】:How big a performance difference will byte have over int?byte 对 int 的性能差异有多大?
【发布时间】:2013-12-02 07:09:12
【问题描述】:

我正在用 Java 编写交通模拟代码,并为我的大部分变量使用 int,包括循环计数器和数据数组。最终读入的数据应该是大约 50 个“代理”和 50 个“节点”,其中每个代理大约有 5 个特征,节点图会随着时钟更新,以反映汽车在道路上行驶的平均速度。

我的问题是,对于可以适应 -127 到 127 范围的变量,我是否应该从使用 int 转换为 byte 类型。这最终会在性能上有显着的提升吗?如果不是,那么性能提升在什么时候(即有问题的变量数或每秒计算数)会显着提高?

【问题讨论】:

  • 我们不知道您的代码中的瓶颈是什么——但您应该能够通过测试确定这一点。您是否已经设定了绩效目标,并编写了基准来检查您是否达到了这些目标?结果如何?
  • AFAIK ,使用 int 更好,因为引入字节会导致额外的努力,从而降低性能,无论 'int' 是否更自然和随意可用
  • 如果您不是从理论角度而是从实际角度提出问题,我会说:别担心。这个问题不会成为瓶颈。

标签: java performance integer byte


【解决方案1】:

不,你根本不应该。由于处理器的体系结构,ints 通常要快得多。当使用bytes 进行计算时,您的 CPU 在内部将所有内容转换为字节并返回。

【讨论】:

    【解决方案2】:

    这最终会对性能有显着提升吗?如果不是,那么在什么时候(即有问题的变量数或每秒计算的数量)会显着提高性能?

    它不会提高性能。事实上,如果您使用byte 而不是int,我预计计算会更慢。典型的本机指令集不支持按字节计算。相反,它将使用 32 位指令来实现,并且需要额外的指令来在 8 位和 32 位之间进行转换。

    我希望您看到性能改进的唯一情况是您对数字数组进行大规模操作。这是因为一个大字节数组占用了一个大整数数组(具有相同长度)的内存的 1/4。由于大规模的限制因素是内存带宽,您将看到性能提升。 (由于减少了对 GC 和虚拟内存系统的内存需求的影响,还会带来次要的性能优势。)

    请注意,您不会为单个 byte 字段或局部变量获取此信息,因为 JVM 会在字边界上对齐它们。

    【讨论】:

      【解决方案3】:

      假设 Intel CPU - 您是否研究过使用 SSE 指令,您可能能够同时操作 16 x 8 位字节。我相信 SSE 参数可以通过 Java 获得,但没有尝试过。

      【讨论】:

      • 根据 OP 对问题的描述,我认为这些说明不太可能适用。此外,如果他使用 Java 编码,“他”不会使用这些指令。决定使用它们的是本机代码编译器/优化器。
      【解决方案4】:

      在大多数现代 32 位或 64 位系统上,使用与系统原生 int 大小不同的任何东西都会对性能产生影响,因为您必须将较小的变量零/符号扩展到寄存器大小,或者屏蔽扩展位以将值限制在类型的范围内。

      但在某些情况下,如果您的程序在一个大数组中非常频繁地访问内存,那么对数组使用更窄的类型可能会提高性能,因为瓶颈通常是 I/O,这也会使更多元素适合缓存,从而减少内存访问很大。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-20
        • 1970-01-01
        • 2012-03-17
        • 2012-09-03
        • 1970-01-01
        • 1970-01-01
        • 2015-10-14
        • 2015-04-03
        相关资源
        最近更新 更多