平时在写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