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