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

Java程序性能優化(3)

2013-11-23 19:07:08  來源: Java核心技術 

  十四對於boolean值避免不必要的等式判斷

  將一個boolean值與一個true比較是一個恆等操作(直接返回該boolean變量的值) 移走對於boolean的不必要操作至少會帶來個好處

  )代碼執行的更快 (生成的字節碼少了個字節)

  )代碼也會更加干淨

  例子

  public class UEQ

  {

  boolean method (String string) {

  return stringendsWith (a) == true;   // Violation

  }

  }

  更正

  class UEQ_fixed

  {

  boolean method (String string) {

  return stringendsWith (a);

  }

  }

  十五對於常量字符串String 代替 StringBuffer

  常量字符串並不需要動態改變長度

  例子

  public class USC {

  String method () {

  StringBuffer s = new StringBuffer (Hello);

  String t = s + World!;

  return t;

  }

  }

  更正

  把StringBuffer換成String如果確定這個String不會再變的話這將會減少運行開銷提高性能

  十六StringTokenizer 代替 indexOf()substring()

  字符串的分析在很多應用中都是常見的使用indexOf()和substring()來分析字符串容易導致StringIndexOutOfBoundsException而使用StringTokenizer類來分析字符串則會容易一些效率也會高一些

  例子

  public class UST {

  void parseString(String string) {

  int index = ;

  while ((index = stringindexOf( index)) != ) {

  Systemoutprintln (stringsubstring(index stringlength()));

  }

  }

  }

  參考資料

  Graig Larman Rhett Guthrie: Java Performance and Idiom Guide

  Prentice Hall PTR ISBN: pp

  十七使用條件操作符替代if (cond) return; else return; 結構

  條件操作符更加的簡捷

  例子

  public class IF {

  public int method(boolean isDone) {

  if (isDone) {

  return ;

  } else {

  return ;

  }

  }

  }

  更正

  public class IF {

  public int method(boolean isDone) {

  return (isDone ? : );

  }

  }

  十八使用條件操作符代替if (cond) a = b; else a = c; 結構

  例子

  public class IFAS {

  void method(boolean isTrue) {

  if (isTrue) {

  _value = ;

  } else {

  _value = ;

  }

  }

  private int _value = ;

  }

  更正

  public class IFAS {

  void method(boolean isTrue) {

  _value = (isTrue ? : );       // compact expression

  }

  private int _value = ;

  }

  十九不要在循環體中實例化變量

  在循環體中實例化臨時變量將會增加內存消耗

  例子

  import javautilVector;

  public class LOOP {

  void method (Vector v) {

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

  Object o = new Object();

  o = velementAt(i);

  }

  }

  }

  更正

  在循環體外定義變量並反復使用

  import javautilVector;

  public class LOOP {

  void method (Vector v) {

  Object o;

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

  o = velementAt(i);

  }

  }

  }

  二十確定 StringBuffer的容量

  StringBuffer的構造器會創建一個默認大小(通常是)的字符數組在使用中如果超出這個大小就會重新分配內存創建一個更大的數組並將原先的數組復制過來再丟棄舊的數組在大多數情況下你可以在創建StringBuffer的時候指定大小這樣就避免了在容量不夠的時候自動增長以提高性能

  例子

  public class RSBC {

  void method () {

  StringBuffer buffer = new StringBuffer(); // violation

  bufferappend (hello);

  }

  }

  更正

  為StringBuffer提供寢大小

  public class RSBC {

  void method () {

  StringBuffer buffer = new StringBuffer(MAX);

  bufferappend (hello);

  }

  private final int MAX = ;

  }

  參考資料

  Dov Bulka Java Performance and Scalability Volume : ServerSide Programming

  Techniques Addison Wesley ISBN: p

  二十一盡可能的使用棧變量

  如果一個變量需要經常訪問那麼你就需要考慮這個變量的作用域了static? local?還是實例變量?訪問靜態變量和實例變量將會比訪問局部變量多耗費個時鐘周期

  例子

  public class USV {

  void getSum (int[] values) {

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

  _sum += value[i];           // violation

  }

  }

  void getSum (int[] values) {

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

  _staticSum += value[i];

  }

  }

  private int _sum;

  private static int _staticSum;

  }

  更正

  如果可能請使用局部變量作為你經常訪問的變量

  你可以按下面的方法來修改getSum()方法

  void getSum (int[] values) {

  int sum = _sum;  // temporary local variable

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

  sum += value[i];

  }

  _sum = sum;

  }

  參考資料

  Peter Haggar: Practical Java Programming Language Guide

  Addison Wesley pp

  二十二不要總是使用取反操作符(!)

  取反操作符(!)降低程序的可讀性所以不要總是使用

  例子

  public class DUN {

  boolean method (boolean a boolean b) {

  if (!a)

  return !a;

  else

  return !b;

  }

  }

  更正

  如果可能不要使用取反操作符(!)

  二十三與一個接口 進行instanceof操作

  基於接口的設計通常是件好事因為它允許有不同的實現而又保持靈活只要可能對一個對象進行instanceof操作以判斷它是否某一接口要比是否某一個類要快

  例子

  public class INSOF {

  private void method (Object o) {

  if (o instanceof InterfaceBase) { }  // better

  if (o instanceof ClassBase) { }   // worse

  }

  }

  class ClassBase {}

  interface InterfaceBase {}


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