【问题标题】:java efficiency comparison in terms of memory allocationjava在内存分配方面的效率比较
【发布时间】: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在第一个代码中分配变量an^2次jn次,或者两者都只分配一次,如第二个代码。

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

谢谢

【问题讨论】:

    标签: java performance memory-management memory-efficient


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2018-12-15
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多