代码改变世界

For-each Loop,Index++ Loop , Iterator 那个效率更高

2017-11-30 17:50  halberts  阅读(1238)  评论(0编辑  收藏  举报

平时在写Java/C# 程序的时候,会写很多的Loop 语句,for() 及 Iterator loop 及Java 8 的foreach Loop, 这些Loop 那种效率最高呢?写个小程序测试一下。

Java8

 

public class LoopPerf {
  private static  int loopSize=5000000;
   public static void main(String args[]){
    LoopPerf loopPerf=new LoopPerf();
  }   
}

public ArrayList<Integer> prepareData(int loopSize) {
ArrayList list = new ArrayList<>(loopSize);
for (int index = 0; index < loopSize; index++) {
list.add(index);
}
return list;
}

1.经常使用的 for(int index=0;index<size;index++)

  public void indexLoop(){
    ArrayList<Integer> list = prepareData(loopSize);
    long start=System.currentTimeMillis();
    for(int index=0;index<list.size();index++){
      Integer temp=list.get(index);
      temp.toString();
    }
    long end=System.currentTimeMillis();
    System.out.println("indexLoop Time="+(end-start));
  }

运行结果 : indexLoop Time=393
    

2. for loop

 public void forLoop(){
    ArrayList<Integer> list = prepareData(loopSize);
    long start=System.currentTimeMillis();
    for(Integer s:list){
      s.toString();
    }
    long end=System.currentTimeMillis();
    System.out.println("forLoop Time="+(end-start));
  }

运行结果:forLoop Time=367

3. for iterator Loop

 private void iteratorLoop(){
    List<Integer> a = prepareData(loopSize);
    long start=System.currentTimeMillis();
    for (Iterator iterator = a.iterator();iterator.hasNext();)
    {
      Integer integer = (Integer) iterator.next();
      integer.toString();
    }
    long end=System.currentTimeMillis();
    System.out.println("iteratorLoop Time="+(end-start));
  }
运行结果:forLoop Time=368

 

4.foreach loop(java 8)

 private void forEachLoop(){
    List<Integer> a = prepareData(loopSize);
    long start=System.currentTimeMillis();
    a.forEach(item->item.toString());
    long end=System.currentTimeMillis();
    System.out.println("forEachLoop Time="+(end-start));
  }
运行结果:forEachLoop Time=372

分析其中的结果,2,3的结果是非常接近的。看到 2,3 生成的java class byte code 代码是一样的。

例子 2 的java class byte code
// Byte code ALOAD 1 INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator; ASTORE 3 GOTO L2 L3 ALOAD 3 INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object; CHECKCAST java/lang/Integer ASTORE 2 ALOAD 2 INVOKEVIRTUAL java/lang/Integer.toString()Ljava/lang/String; POP L2 ALOAD 3 INVOKEINTERFACE java/util/Iterator.hasNext()Z IFNE L3
//例子3的java class byte code 

List<Integer> a = new ArrayList<Integer>(); for (Iterator iterator = a.iterator(); iterator.hasNext();) { Integer integer = (Integer) iterator.next(); integer.toString(); } // Bytecode: ALOAD 1 INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator; ASTORE 2 GOTO L7 L8 ALOAD 2 INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object; CHECKCAST java/lang/Integer ASTORE 3 ALOAD 3 INVOKEVIRTUAL java/lang/Integer.toString()Ljava/lang/String; POP L7 ALOAD 2 INVOKEINTERFACE java/util/Iterator.hasNext()Z IFNE L8

从运行结果看,2,3是效率最高的,4次之,1效率最差。

 

 

http://bbs.pinggu.org/?fromuid=5397734