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

Java程序性能優化(2)

2022-06-13   來源: Java核心技術 

  八如果只是查找單個字符的話用charAt()代替startsWith()

  用一個字符作為參數調用startsWith()也會工作的很好但從性能角度上來看調用用String API無疑是錯誤的!

  例子

  public class PCTS {

  private void method(String s) {

  if (sstartsWith(a)) { // violation

  //

  }

  }

  }

  更正

  將startsWith() 替換成charAt()

  public class PCTS {

  private void method(String s) {

  if (a == scharAt()) {

  //

  }

  }

  }

  參考資料

  Dov Bulka Java Performance and Scalability Volume : ServerSide Programming

  Techniques  Addison Wesley ISBN:

  九使用移位操作來代替a / b操作

  /是一個很昂貴的操作使用移位操作將會更快更有效

  例子

  public class SDIV {

  public static final int NUM = ;

  public void calculate(int a) {

  int div = a / ;            // should be replaced with a >>

  int div = a / ;         // should be replaced with a >>

  int temp = a / ;

  }

  }

  更正

  public class SDIV {

  public static final int NUM = ;

  public void calculate(int a) {

  int div = a >> ;

  int div = a >> ;

  int temp = a / ;       // 不能轉換成位移操作

  }

  }

  十使用移位操作代替a * b

  同上

  [i]但我個人認為除非是在一個非常大的循環內性能非常重要而且你很清楚你自己在做什麼方可使用這種方法否則提高性能所帶來的程序晚讀性的降低將是不合算的

  例子

  public class SMUL {

  public void calculate(int a) {

  int mul = a * ;            // should be replaced with a <<

  int mul = * a;         // should be replaced with a <<

  int temp = a * ;

  }

  }

  更正

  package OPT;

  public class SMUL {

  public void calculate(int a) {

  int mul = a << ;

  int mul = a << ;

  int temp = a * ;       // 不能轉換

  }

  }

  十一在字符串相加的時候使用 代替 如果該字符串只有一個字符的話

  例子

  public class STR {

  public void method(String s) {

  String string = s + d  // violation

  string = abc + d      // violation

  }

  }

  更正

  將一個字符的字符串替換成

  public class STR {

  public void method(String s) {

  String string = s + d

  string = abc + d

  }

  }

  十二不要在循環中調用synchronized(同步)方法

  方法的同步需要消耗相當大的資料在一個循環中調用它絕對不是一個好主意

  例子

  import javautilVector;

  public class SYN {

  public synchronized void method (Object o) {

  }

  private void test () {

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

  method (vectorelementAt(i));    // violation

  }

  }

  private Vector vector = new Vector ( );

  }

  更正

  不要在循環體中調用同步方法如果必須同步的話推薦以下方式

  import javautilVector;

  public class SYN {

  public void method (Object o) {

  }

  private void test () {

  synchronized{//在一個同步塊中執行非同步方法

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

  method (vectorelementAt(i));

  }

  }

  }

  private Vector vector = new Vector ( );

  }

  十三將try/catch塊移出循環

  把try/catch塊放入循環體內會極大的影響性能如果編譯JIT被關閉或者你所使用的是一個不帶JIT的JVM性能會將下降%之多!

  例子

  import javaioFileInputStream;

  public class TRY {

  void method (FileInputStream fis) {

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

  try {                                      // violation

  _sum += fisread();

  } catch (Exception e) {}

  }

  }

  private int _sum;

  }

  更正

  將try/catch塊移出循環

  void method (FileInputStream fis) {

  try {

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

  _sum += fisread();

  }

  } catch (Exception e) {}

  }

  參考資料

  Peter Haggar: Practical Java Programming Language Guide

  Addison Wesley pp


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