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

java性能優化-之一

2013-11-23 17:53:16  來源: Javascript 

  .對象的生成和大小的調整
  JAVA程序設計中一個普遍的問題就是沒有好好的利用JAVA語言本身提供的函數從而常常會生成大量的對象(或實例)由於系統不僅要花時間生成對象以後可能還需花時間對這些對象進行垃圾回收和處理因此生成過多的對象將會給程序的性能帶來很大的影響
  
  例關於String StringBuffer+和append
  JAVA語言提供了對於String類型變量的操作但如果使用不當會給程序的性能帶來影響如下面的語句
  String name=new String(HuangWeiFeng);
  Systemoutprintln(name+is my name);
  看似已經很精簡了其實並非如此為了生成二進制的代碼要進行如下的步驟和操作
  () 生成新的字符串 new String(STR_);
  () 復制該字符串
  () 加載字符串常量HuangWeiFeng(STR_);
  () 調用字符串的構架器(Constructor);
  () 保存該字符串到數組中(從位置開始)
  () 從javaioPrintStream類中得到靜態的out變量
  () 生成新的字符串緩沖變量new StringBuffer(STR_BUF_);
  () 復制該字符串緩沖變量
  () 調用字符串緩沖的構架器(Constructor);
  () 保存該字符串緩沖到數組中(從位置開始)
  () 以STR_為參數調用字符串緩沖(StringBuffer)類中的append方法
  () 加載字符串常量is my name(STR_);
  () 以STR_為參數調用字符串緩沖(StringBuffer)類中的append方法
  () 對於STR_BUF_執行toString命令
  () 調用out變量中的println方法輸出結果
  
  由此可以看出這兩行簡單的代碼就生成了STR_STR_STR_STR_和STR_BUF_五個對象變量這些生成的類的實例一般都存放在堆中堆要對所有類的超類類的實例進行初始化同時還要調用類極其每個超類的構架器而這些操作都是非常消耗系統資源的因此對對象的生成進行限制是完全有必要的
  經修改上面的代碼可以用如下的代碼來替換
  
  StringBuffer name=new StringBuffer(HuangWeiFeng);
  Systemoutprintln(nameappend(is my name)toString()); 
  
  系統將進行如下的操作
  () 生成新的字符串緩沖變量new StringBuffer(STR_BUF_);
  () 復制該字符串緩沖變量
  () 加載字符串常量HuangWeiFeng(STR_);
  () 調用字符串緩沖的構架器(Constructor);
  () 保存該字符串緩沖到數組中(從位置開始)
  () 從javaioPrintStream類中得到靜態的out變量
  () 加載STR_BUF_;
  () 加載字符串常量is my name(STR_);
  () 以STR_為參數調用字符串緩沖(StringBuffer)實例中的append方法
  () 對於STR_BUF_執行toString命令(STR_)
  ()調用out變量中的println方法輸出結果
  由此可以看出經過改進後的代碼只生成了四個對象變量STR_STR_STR_和STR_BUF_你可能覺得少生成一個對象不會對程序的性能有很大的提高但下面的代碼段的執行速度將是代碼段因為代碼段生成了八個對象而代碼段只生成了四個對象
  代碼段
  String name= new StringBuffer(HuangWeiFeng);
  name+=is my;
  name+=name; 
  
  代碼段
  StringBuffer name=new StringBuffer(HuangWeiFeng);
  nameappend(is my);
  nameappend(name)toString(); 
  
  因此充分的利用JAVA提供的庫函數來優化程序對提高JAVA程序的性能時非常重要的其注意點主要有如下幾方面
  () 盡可能的使用靜態變量(Static Class Variables)
  如果類中的變量不會隨他的實例而變化就可以定義為靜態變量從而使他所有的實例都共享這個變量
  例
  public class foo
  {
  SomeObject so=new SomeObject();
  } 
  
  就可以定義為
  public class foo
  {
  static SomeObject so=new SomeObject();
  } 
  
  () 不要對已生成的對象作過多的改變
  對於一些類(如String類)來講寧願在重新生成一個新的對象實例而不應該修改已經生成的對象實例
  例
  String name=Huang;
  name=Wei;
  name=Feng;
  上述代碼生成了三個String類型的對象實例而前兩個馬上就需要系統進行垃圾回收處理如果要對字符串進行連接的操作性能將得更差因為系統將不得為此生成更多得臨時變量如上例所示 
  () 生成對象時要分配給它合理的空間和大小
  JAVA中的很多類都有它的默認的空間分配大小對於StringBuffer類來講默認的分配空間大小是個字符如果在程序中使用StringBuffer的空間大小不是個字符那麼就必須進行正確的初始化
  () 避免生成不太使用或生命周期短的對象或變量
  對於這種情況因該定義一個對象緩沖池以為管理一個對象緩沖池的開銷要比頻繁的生成和回收對象的開銷小的多
  () 只在對象作用范圍內進行初始化
  JAVA允許在代碼的任何地方定義和初始化對象這樣就可以只在對象作用的范圍內進行初始化從而節約系統的開銷
  例
  SomeObject so=new SomeObject();
  If(x==) then
  {
  Foo=sogetXX();
  }
  可以修改為
  if(x==) then
  {
  SomeObject so=new SomeObject();
  Foo=sogetXX();
  }
From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25287.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.