您现在的位置是:首页 >

Java程序性能优化(2)

火烧 2022-06-14 17:33:39 1054
Java程序性能优化 2   八 如果只是查找单个字符的话 用charAt 代替 tart With   用一个字符作为参数调用 tart With 也会工作的很好 但从性能角度上来看 调用用Stri

Java程序性能优化(2)  

  八 如果只是查找单个字符的话 用charAt()代替startsWith()

  用一个字符作为参数调用startsWith()也会工作的很好 但从性能角度上来看 调用用String API无疑是错误的!

  例子

  public class PCTS {

  private void method(String s) {

  if (s startsWith( a )) { // violation

  //

  }

  }

  }

  更正

  将 startsWith() 替换成 charAt()

  public class PCTS {

  private void method(String s) {

  if ( a == s charAt( )) {

  //

  }

  }

  }

  参考资料

  Dov Bulka Java Performance and Scalability Volume : Server Side 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 * ;       // 不能转换

  }

  }

Java程序性能优化(2)

  十一 在字符串相加的时候 使用 代替 如果该字符串只有一个字符的话

  例子

  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 java util Vector;

  public class SYN {

  public synchronized void method (Object o) {

  }

  private void test () {

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

  method (vector elementAt(i));    // violation

  }

  }

  private Vector vector = new Vector ( );

  }

  更正

  不要在循环体中调用同步方法 如果必须同步的话 推荐以下方式

  import java util Vector;

  public class SYN {

  public void method (Object o) {

  }

  private void test () {

  synchronized{//在一个同步块中执行非同步方法

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

  method (vector elementAt(i));

  }

  }

  }

  private Vector vector = new Vector ( );

  }

  十三 将try/catch块移出循环

  把try/catch块放入循环体内 会极大的影响性能 如果编译JIT被关闭或者你所使用的是一个不带JIT的JVM 性能会将下降 %之多!

  例子

  import java io FileInputStream;

  public class TRY {

  void method (FileInputStream fis) {

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

  try {                                      // violation

  _sum += fis read();

  } catch (Exception e) {}

  }

  }

  private int _sum;

  }

  更正

  将try/catch块移出循环

  void method (FileInputStream fis) {

  try {

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

  _sum += fis read();

  }

  } catch (Exception e) {}

  }

  参考资料

  Peter Haggar: Practical Java Programming Language Guide

lishixinzhi/Article/program/Java/hx/201311/26547  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码