java在内存分配方面的效率比较
Posted
技术标签:
【中文标题】java在内存分配方面的效率比较【英文标题】:java efficiency comparison in terms of memory allocation 【发布时间】:2013-04-03 07:15:30 【问题描述】:这可能是一个重复的问题,但我找不到我正在搜索的内容。如果存在,抱歉重复。
我想知道以下部分代码在内存分配方面是否相同。
//first
int n = some_number;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
int a = something;
//second
int i, j, a;
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
a = something;
我想知道,如果java在第一个代码中分配变量a
n^2次和j
n次,或者两者都只分配一次,如第二个代码。
我在 java 中尝试了这几次,但结果不一致,第一次是 8 秒,第二次是 9 秒,在另一次试验中相反。所以,我想确定它们是否相等,
谢谢
【问题讨论】:
【参考方案1】:查看是否存在差异的一种简单方法是检查字节码。
第一个版本编译为:
public static void f();
Code:
0: bipush 100
2: istore_0
3: iconst_0
4: istore_1
5: goto 26
8: iconst_0
9: istore_2
10: goto 18
13: iconst_3
14: istore_3
15: iinc 2, 1
18: iload_2
19: iload_0
20: if_icmplt 13
23: iinc 1, 1
26: iload_1
27: iload_0
28: if_icmplt 8
31: return
而第二个编译为:
public static void g();
Code:
0: bipush 100
2: istore_3
3: iconst_0
4: istore_0
5: goto 26
8: iconst_0
9: istore_1
10: goto 18
13: iconst_3
14: istore_2
15: iinc 1, 1
18: iload_1
19: iload_3
20: if_icmplt 13
23: iinc 0, 1
26: iload_0
27: iload_3
28: if_icmplt 8
31: return
如果你仔细比较它们,你会发现它们本质上是相同的。
从风格上讲,我认为最好在尽可能接近首次使用时声明变量。考虑到这一点,我会选择第一个版本而不是第二个版本。
【讨论】:
很好的建议。我将添加如何获取字节码反汇编:javap -c package.Class
以上是关于java在内存分配方面的效率比较的主要内容,如果未能解决你的问题,请参考以下文章