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

Java程序性能優化(1)

2013-11-23 18:55:18  來源: Java核心技術 

  一避免在循環條件中使用復雜表達式

  在不做編譯優化的情況下在循環中循環條件會被反復計算如果不使用復雜表達式而使循環條件值不變的話程序將會運行的更快

  例子

  import javautilVector;

  class CEL {

  void method (Vector vector) {

  for (int i = ; i < vectorsize (); i++)  // Violation

  ; //

  }

  }

  更正

  class CEL_fixed {

  void method (Vector vector) {

  int size = vectorsize ()

  for (int i = ; i < size; i++)

  ; //

  }

  }

  二VectorsHashtables定義初始大小

  JVM為Vector擴充大小的時候需要重新創建一個更大的數組將原原先數組中的內容復制過來最後原先的數組再被回收可見Vector容量的擴大是一個頗費時間的事

  通常默認的個元素大小是不夠的你最好能准確的估計你所需要的最佳大小

  例子

  import javautilVector;

  public class DIC {

  public void addObjects (Object[] o) {

  // if length > Vector needs to expand

  for (int i = ; i< olength;i++) {

  vadd(o);   // capacity before it can add more elements

  }

  }

  public Vector v = new Vector();  // no initialCapacity

  }

  更正

  自己設定初始大小

  public Vector v = new Vector();

  public Hashtable hash = new Hashtable();

  參考資料

  Dov Bulka Java Performance and Scalability Volume : ServerSide Programming

  Techniques Addison Wesley ISBN: pp

  三在finally塊中關閉Stream

  程序中使用到的資源應當被釋放以避免資源洩漏這最好在finally塊中去做不管程序執行的結果如何finally塊總是會執行的以確保資源的正確關閉

  例子

  import javaio*;

  public class CS {

  public static void main (String args[]) {

  CS cs = new CS ();

  thod ();

  }

  public void method () {

  try {

  FileInputStream fis = new FileInputStream (CSjava);

  int count = ;

  while (fisread () != )

  count++;

  Systemoutprintln (count);

  fisclose ();

  } catch (FileNotFoundException e) {

  } catch (IOException e) {

  }

  }

  }

  更正

  在最後一個catch後添加一個finally塊

  參考資料

  Peter Haggar: Practical Java Programming Language Guide

  Addison Wesley pp

  四使用Systemarraycopy ()代替通過來循環復制數組

  Systemarraycopy () 要比通過循環來復制數組快的多

  例子

  public class IRB

  {

  void method () {

  int[] array = new int [];

  for (int i = ; i < arraylength; i++) {

  array [i] = i;

  }

  int[] array = new int [];

  for (int i = ; i < arraylength; i++) {

  array [i] = array [i];                 // Violation

  }

  }

  }

  更正

  public class IRB

  {

  void method () {

  int[] array = new int [];

  for (int i = ; i < arraylength; i++) {

  array [i] = i;

  }

  int[] array = new int [];

  Systemarraycopy(array array );

  }

  }

  參考資料

  

  五讓訪問實例內變量的getter/setter方法變成final

  簡單的getter/setter方法應該被置成final這會告訴編譯器這個方法不會被重載所以可以變成inlined

  例子

  class MAF {

  public void setSize (int size) {

  _size = size;

  }

  private int _size;

  }

  更正

  class DAF_fixed {

  final public void setSize (int size) {

  _size = size;

  }

  private int _size;

  }

  參考資料

  Warren N and Bishop P () Java in Practice p

  AddisonWesley ISBN

  六避免不需要的instanceof操作

  如果左邊的對象的靜態類型等於右邊的instanceof表達式返回永遠為true

  例子

  public class UISO {

  public UISO () {}

  }

  class Dog extends UISO {

  void method (Dog dog UISO u) {

  Dog d = dog;

  if (d instanceof UISO) // always true

  Systemoutprintln(Dog is a UISO);

  UISO uiso = u;

  if (uiso instanceof Object) // always true

  Systemoutprintln(uiso is an Object);

  }

  }

  更正

  刪掉不需要的instanceof操作

  class Dog extends UISO {

  void method () {

  Dog d;

  Systemoutprintln (Dog is an UISO);

  Systemoutprintln (UISO is an UISO);

  }

  }

  七避免不需要的造型操作

  所有的類都是直接或者間接繼承自Object同樣所有的子類也都隱含的等於其父類那麼由子類造型至父類的操作就是不必要的了

  例子

  class UNC {

  String _id = UNC;

  }

  class Dog extends UNC {

  void method () {

  Dog dog = new Dog ();

  UNC animal = (UNC)dog;  // not necessary

  Object o = (Object)dog;         // not necessary

  }

  }

  更正

  class Dog extends UNC {

  void method () {

  Dog dog = new Dog();

  UNC animal = dog;

  Object o = dog;

  }

  }

  參考資料

  Nigel Warren Philip Bishop: Java in Practice Design Styles and Idioms

  for Effective Java  AddisonWesley pp


From:http://tw.wingwit.com/Article/program/Java/hx/201311/25979.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.