2

假设list是 ArrayList,以下两个片段中哪个更快。

for(int i=0; i<list.size();i++){...}

或者

int count = list.size();
for(int i=0; i<count;i++){...}

此外,优化(如果有的话)是否适用于 Android 的 ArrayAdapter?

int sCount = mAdapter.getCount();

澄清

在for循环中,编译器是list.size()每次调用还是调用一次并随后使用它。

请注意,每次调用list.size()实际上都会对项目进行计数。这就是问题的本质。

4

6 回答 6

3

在大多数情况下,速度将无法区分。也就是说,如果在循环执行时集合可能会发生变化,那么您的两个循环在语义上是不同的。集合的修改可以在循环中(或在循环中调用的代码中)或在同时执行的不同线程中。

具体回答您的“澄清”:是的,size每次都会通过循环调用该方法。

我永远不会写这个循环的“优化”版本,除非我有明确的证据表明优化很重要(并且集合没有改变)。如果您的代码经过如此调整,以至于这些调整为您提供了可衡量的加速,您应该会很高兴。

于 2013-09-23T20:53:10.640 回答
2

你应该问自己一些问题:

  • 我有性能问题吗?
  • 我是否分析了此代码的瓶颈?

如果展位问题可以用“是”来回答,那么请尝试两种方式并分析结果。

事实上,我认为这不会有什么不同。

于 2013-09-23T20:49:51.503 回答
0

任何体面的编译器都会将它们编译成完全相同的汇编代码。

于 2013-09-23T20:48:08.387 回答
0
int count = list.size();
for(int i=0; i<count;i++){...}// Is faster
于 2013-09-23T20:49:21.103 回答
0

我认为第二段代码稍微快一些。方法调用可能需要将代码加载到内存中,并将数据从方法内存堆栈加载到方法内存堆栈(如在第一段代码中)。这显然比单个内存访问(第一段代码)慢。但是,我认为如果数组大小在循环迭代期间可能发生变化,则使用第一段代码更安全。考虑以下示例:

for(int i=0; i<list.size();i++){
  if list.get(i) == 0 { list.remove(i); i--; }
}    

上面的示例从数组中删除空元素。因此,每次删除元素时,数组大小都会减小。如果您不使用 list.size() 并且忘记适当地更新数组的大小,您最终会出现“索引超出范围”异常。

于 2014-04-28T16:22:40.320 回答
0
    ArrayList list = new ArrayList();
            for(int i=0; i<1000000;i++){
                list.add("Object added "+i);
            }
            long startTime =System.currentTimeMillis();
            for(int i=0; i<list.size();i++){
                System.out.println(list.get(i));
            }
            long endTime = System.currentTimeMillis();




            int count=list.size();
            long startTime1 =System.currentTimeMillis();
            for(int i=0; i<count;i++){
                System.out.println(list.get(i));
            }
            long endTime1 = System.currentTimeMillis();
            System.out.println("Exe1 time in millis secs"+(endTime-startTime));
            System.out.println("Exe2 time in millis secs"+(endTime1-startTime1));

OutPut 
...........
.............

Object added 999999
Exe1 time in millis secs14131
Exe2 time in millis secs14106
于 2013-09-23T21:00:26.270 回答