迭代所有字节值-128-127而不用Java进行强制转换

时间:2012-06-30 00:08:10

标签: java performance iteration

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

2 个答案:

答案 0 :(得分:10)

Java字节已签名,因此它们的值为-128到127.无论如何,您不应该担心类似的强制转换和额外检查,因为它们很容易进行优化。实际上,在JVM级别,没有字节变量这样的东西。无论如何,它被视为一个int。

答案 1 :(得分:3)

  

使用字节迭代器有一个问题,我无法测试b&lt; 128

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

但是,我同意锑的观点,从性能角度来看,使用intbyte可能没什么区别。在字节码级别,JVM仅提供32位和64位整数算术运算符。

在语言层面,我认为类型转换将在byte案例以及int案例中发生。考虑b++实际上等同于

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

并且类型转换不是noop,因为b + 1产生int值。所以

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

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


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

  • 如果您尚未对代码进行分析,那么您很可能会浪费时间尝试调整无关紧要的内容。
  • 您应该依靠实际测量(即对您的应用进行基准测试),而不是直觉或建议更快。准备好让你的直觉证明是错误的。
  • 即使你设法通过微优化获得可观的加速,也要注意加速可能是特定于平台的。实际上,在一个平台上的改进可能会在另一个平台上放缓。