【问题标题】: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 = 0b = 0 生成完全相同的代码。

i &lt; array.lengthb &lt; array.length 生成完全相同的代码。

但是,i++b++ 的代码完全不同。 int 的 1 个字节码指令,byte 的 5 个字节码指令。

JIT 对此做了什么未知,但如果有的话,使用 byte 作为数组迭代器变量会使代码变慢。

不过,正如其他人已经说过的那样,您很可能无法分辨出区别,尤其是相对于循环内部发生的事情(实际上不会是空白的)。

编写对代码逻辑有意义的代码。

【讨论】:

  • 热点可以通过挠痒痒来判断它产生了什么。我没玩过。
【解决方案2】:

没有。尽可能编写最清晰、最直观的代码。 JVM 将在常见用例中发挥最大作用。

如果您关心编写高效的代码,请查看您的算法并阅读有关高效 Java 的书籍。

【讨论】:

    猜你喜欢
    • 2011-01-07
    • 2014-07-03
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    相关资源
    最近更新 更多