内存分配方面的java效率比较

内存分配方面的java效率比较,java,performance,memory-management,memory-efficient,Java,Performance,Memory Management,Memory Efficient,这可能是一个重复的问题,但我找不到我正在搜索的内容。如果存在,很抱歉重复 我想知道,如果以下代码的一部分在内存分配方面是相同的 //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++){ fo

这可能是一个重复的问题,但我找不到我正在搜索的内容。如果存在,很抱歉重复

我想知道,如果以下代码的一部分在内存分配方面是相同的

//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;
    }
}
//首先
int n=某个数字;
对于(int i=0;i
我想知道,java是在第一个代码中分配变量
a
n^2次
j
n次,还是在第二个代码中只分配一次

我在java中尝试了几次,但结果不一致,比如在一次试验中,第一次是8秒,第二次是9秒,在另一次试验中,结果相反。所以,我想确定它们是否相等


谢谢

检查字节码是判断两者是否存在差异的一种简单方法

第一个版本编译为:

  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        
鉴于第二条汇编为:

  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包.Class