【问题标题】:Is using byte in an iteration loop more efficient?在迭代循环中使用字节是否更有效?
【发布时间】:2020-07-29 14:12:21
【问题描述】:
在 Java 中声明一个字节时,您需要的内存空间比声明一个整数要少。那么它是否更有效(例如通过使用更少的内存),迭代例如?使用字节的数组,例如数组长度
如果它更有效,有没有什么例子可以让我真正认识到作为用户的改进?
for(byte b = 0; b < array.length; b++) {}
而不是
for(int i = 0; i < array.length; i++) {}
【问题讨论】:
标签:
java
loops
for-loop
optimization
iteration
【解决方案1】:
好吧,让我们看看编译器生成了什么。
源代码
short[] array = new short[0];
for(int i = 0; i < array.length; i++) {}
for(byte b = 0; b < array.length; b++) {}
字节码
0: iconst_0 array = new short[0];
1: newarray short
3: astore_1
-------------------------------------------------------
4: iconst_0 i = 0
5: istore_2
6: goto 12
9: iinc 2, 1 i++
12: iload_2 i < array.length
13: aload_1
14: arraylength
15: if_icmplt 9
-------------------------------------------------------
18: iconst_0 b = 0
19: istore_2
20: goto 28
23: iload_2 b++
24: iconst_1
25: iadd
26: i2b
27: istore_2
28: iload_2 b < array.length
29: aload_1
30: arraylength
31: if_icmplt 23
-------------------------------------------------------
34: return
i = 0 和 b = 0 生成完全相同的代码。
i < array.length 和 b < array.length 生成完全相同的代码。
但是,i++ 和 b++ 的代码完全不同。 int 的 1 个字节码指令,byte 的 5 个字节码指令。
JIT 对此做了什么未知,但如果有的话,使用 byte 作为数组迭代器变量会使代码变慢。
不过,正如其他人已经说过的那样,您很可能无法分辨出区别,尤其是相对于循环内部发生的事情(实际上不会是空白的)。
编写对代码逻辑有意义的代码。
【解决方案2】:
没有。尽可能编写最清晰、最直观的代码。 JVM 将在常见用例中发挥最大作用。
如果您关心编写高效的代码,请查看您的算法并阅读有关高效 Java 的书籍。