zoukankan      html  css  js  c++  java
  • For-each Loop,Index++ Loop , Iterator 那个效率更高

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

  • 相关阅读:
    Python heapq 模块的实现
    使用Python在2M内存中排序一百万个32位整数
    heapq
    将不确定变成确定~Uri文本文件不用浏览器自动打开,而是下载到本地
    说说设计模式~组合模式(Composite)
    JS~字符串长度判断,超出进行自动截取(支持中文)
    DDD~基础设施层~续
    谈谈设计模式~原型模式(Prototype)
    Study note for Continuous Probability Distributions
    Spring——AOP配置时的jar包异常
  • 原文地址:https://www.cnblogs.com/halberts/p/7930244.html
Copyright © 2011-2022 走看看