7

我需要遍历所有字节值(-128 到 127 包括在内)。我可以使用int迭代器,但每次都必须转换为byte. 使用byte迭代器存在我无法测试的问题,b < 128因为它会溢出。我想过使用一个while循环并在递增之前进行测试,这是迄今为止我最好的解决方案。有更好的方法吗?

4

2 回答 2

10

Java 字节是有符号的,所以它们的值是 -128 到 127。无论如何,你不应该担心这样的强制转换和额外的检查,因为它们很容易被优化掉。事实上,在 JVM 级别,不存在字节变量之类的东西。无论如何,它都被视为 int 。

于 2012-06-30T00:10:08.377 回答
3

使用字节迭代器的问题是我无法测试 b < 128

测试b == 127作为循环终止条件。

但是,我同意 Antimony 的观点,无论您使用int还是byte从性能角度来看,它可能都没有区别。在字节码级别,JVM 仅提供 32 位和 64 位整数算术运算符。

在语言层面,我认为类型转换将在byte案例和int案例中发生。考虑这b++实际上相当于

    byte b = ...;
    b = (byte) (b + 1);

并且 typecast 不是 noop 因为b + 1产生一个int值。所以

    for (byte b = -128; b != 127; b++) {
        ...
    }

其中有一个概念类型转换。从性能的角度来看,这是否意味着什么是值得商榷的,因为 JIT 在生成本机代码时做了很多工作来优化掉不必要的操作。


最后,关于 Java 中的微优化的标准要点:

  • 如果您尚未对代码进行概要分析,则很有可能您正在浪费时间尝试调整无关紧要的内容。
  • 您应该依靠实际测量(即对您的应用程序进行基准测试)而不是直觉或建议什么更快。准备好让你的直觉被证明是错误的。
  • 即使您确实设法通过微优化获得了可观的加速,请注意加速可能是特定于平台的。事实上,一个平台的改进可能是另一个平台的放缓。
于 2012-06-30T01:49:18.190 回答