熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

兩段Java程序的效率

2022-06-13   來源: Java核心技術 
    //代碼
   
    public class Obj {
   
    private int i;
   
    public int getI() {
   
    return i;
   
    }
   
    public void setI(int i) {
   
    thisi = i;
   
    }
   
    }
   
    //代碼
   
    List result = new ArrayList()
   
    Obj o =null; ※
   
    for(int i=;i<;i++){
   
    o =new Obj()
   
    osetI(i)
   
    resultadd(o)
   
    }
   
    //代碼
   
    List result = new ArrayList()
   
    for(int i=;i<;i++){
   
    Obj o =new Obj()
   
    osetI(i)
   
    resultadd(o)
   
    }
   
    很多人的結論如下
   
    )代碼比代碼的效率高
   
    )代碼的可維護性不如代碼因為變量作用域擴大了
   
    其實結論)是錯誤的
   
    第段代碼反匯編及說明
   
   
   
    :   new     #;           //new ArrayList()
   
    :   dup                   //將新創建的ArrayList的引用復制並壓入棧
   
    :   invokespecial   #;   //編譯器插入的ArrayList初始化方法ArrayList<init>
   
    :   astore_              //局部變量賦值result = new ArrayList()
   
    :   aconst_null           //局部變量賦值o = null
   
    :   astore_
   
    :  iconst_              //局部變量賦值i =
   
    :  istore_
   
    :  iload_               //比較i和
   
    :  bipush 
   
    :  if_icmpge           //如果i >= 函數返回
   
    :  new     #;           //new Obj()
   
    :  dup                   //將新創建的Obj的引用復制並壓入棧
   
    :  invokespecial   #;   //編譯器插入的Obj初始化方法 Method <init>
   
    :  astore_              //局部變量賦值o = new Obj()
   
    :  aload_               //准備調用參數棧取出局部變量的引用並壓棧 o
   
    :  iload_               //准備調用參數棧取出局部變量的值並壓棧i
   
    :  invokevirtual   #;   //方法調用oset(i)
   
    :  aload_               //取出局部變量的引用並壓棧 result
   
    :  aload_               //取出局部變量的引用並壓棧 o
   
    :  invokeinterface #  ;   //調用Listadd()方法 resultadd(o)
   
    :  pop
   
    :  iinc              //i++
   
    :  goto                //回到for循環頭
   
    :  return                //函數返回
   
   
   
    第段代碼反匯編及說明
   
   
   
    :   new     #;           //new ArrayList()
   
    :   dup                   /將新創建的ArrayList的引用復制並壓入棧
   
    :   invokespecial   #;   //編譯器插入的ArrayList初始化方法ArrayList<init>
   
    :   astore_              /局部變量賦值result = new ArrayList()
   
    :   iconst_              //局部變量賦值i =
   
    :   istore_
   
    :  iload_               //比較i和
   
    :  bipush 
   
    :  if_icmpge           //如果i >= 函數返回
   
    :  new     #;           //new Obj()
   
    :  dup                   //將新創建的Obj的引用復制並壓入棧
   
    :  invokespecial   #;   //編譯器插入的Obj初始化方法 Method <init>
   
    :  astore_              //局部變量賦值o = new Obj()
   
    :  aload_               //准備調用參數棧取出局部變量的引用並壓棧 o
   
    :  iload_               //准備調用參數棧取出局部變量的值並壓棧i
   
    :  invokevirtual   #;   //方法調用oset(i)
   
    :  aload_               //取出局部變量的引用並壓棧 result
   
    :  aload_               //取出局部變量的引用並壓棧 o
   
    :  invokeinterface #  ;   //調用Listadd()方法 resultadd(o)
   
    :  pop
   
    :  iinc              //i++
   
    :  goto                //回到for循環頭
   
    :  return                //函數返回
   
   
   
    小結
   
    代碼效率顯然不如代碼紅色那兩行是多余的
   
    代碼可維護性比較差馮勇強前面有說明
   
    代碼與代碼的差異除了多了那兩句就是局部變量的索引順序不同循環體的反匯編也是完全一樣的所以代碼各方面都不如代碼一般推薦的寫法這與大多數人日常編碼習慣是一致的
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25833.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.