【问题标题】:Calling size() in a for loop condition, bad efficiency? [duplicate]在 for 循环条件下调用 size(),效率低下? [复制]
【发布时间】:2015-08-26 19:50:18
【问题描述】:

我只是想知道一般情况下,这段代码效率低吗:

for (int i = 0; i < array.size(); i++) {
    //do something
}

相对于:

int x = array.size(); 

for (int i = 0; i < x; i++) {
    //do something
}

还是可以忽略不计? (在嵌套的 for 循环中怎么样?)

【问题讨论】:

  • 您是在编写业务应用程序还是火箭芯片?可能只对后者很重要:)
  • 可以忽略不计。别担心。
  • 类似,但对于数组:stackoverflow.com/a/1208331/3040381
  • 编译器不会优化它以最终获得相同的代码。问。

标签: java


【解决方案1】:

假设arrayArrayList,这几乎没有区别,因为size() 的实现只是访问一个成员字段:

public int size() {
    return size;
}

第二个代码只是将字段值保存在局部变量中并在循环中重复使用它而不是每次都访问该字段,因此这只是访问局部变量与访问字段之间的区别(访问局部变量稍微快一些)。

【讨论】:

    【解决方案2】:

    您可以自己进行如下测试:

    public static void main(String[] args) {
        ArrayList<Long> array = new ArrayList<Long>(99999);
        int i = 0;
        while (i < 99999) {
            array.add(1L);
            i++;
        }
        long ini1 = System.currentTimeMillis();
        i = 0;
        for (int j = 0; j < array.size(); j++) {
            i += array.get(j);
        }
        long end1 = System.currentTimeMillis();
        System.out.println("Time1: " + (end1 - ini1));
        long ini2 = System.currentTimeMillis();
        i = 0;
        for (int j = 0; j < 99999; j++) {
            i += array.get(j);
        }
        long end2 = System.currentTimeMillis();
        System.out.println("Time2: " + (end2 - ini2));
    }
    

    输出:

    Time1: 13
    Time2: 10
    

    我认为差异在大多数应用程序和案例中都无关紧要,我多次运行测试并且时间有所不同,但差异至少在百分比方面保持“恒定”......

    【讨论】:

    • 我认为第二个循环应该使用局部变量而不是文字 99999 以准确复制 OP 的情况。但这不应该真的有什么不同......
    • @manouti 是的,你是对的,但我测试了这两种情况,结果非常相似,我选择这个来减少一些代码;)。
    【解决方案3】:

    数组没有大小,只有长度

    for (int i = 0; i < array.length; i++) {
        //do something
    }
    

    效率为 O(1)。

    【讨论】:

      【解决方案4】:

      实际上,如果 array.size 不是很大,性能几乎相同。 你总是可以这样:

      for (int i = 0, x = array.length; i < x; i++) {
          //do something
      }
      

      【讨论】:

        猜你喜欢
        • 2020-10-10
        • 1970-01-01
        • 1970-01-01
        • 2011-03-08
        • 1970-01-01
        • 1970-01-01
        • 2017-10-02
        • 1970-01-01
        • 2019-11-14
        相关资源
        最近更新 更多