• 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

  • 相关阅读:
    板子的配置
    检查点队列中未提交的数据块如何管理会减少内存使用
    js求月末new Date(year,month,0)
    js 截取字符串
    es6 x,y 互换值
    android x86 9.0r2 install guide 旧笔记本改造机顶盒
    Linux中常用命令
    在pyspark中调用scala/java代码
    Linux中安装sbt
    IDEA中手动引入JAR包
  • 原文地址:https://www.cnblogs.com/halberts/p/7930244.html
Copyright © 2020-2023  润新知