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(0)) {

  // ...

  }

  }

  }

  参考资料:

  Dov Bulka, "Java Performance and Scalability Volume 1: Server-Side Programming

  Techniques"  Addison Wesley, ISBN: 0-201-70429-3

  九、使用移位操作来代替'a / b'操作

  "/"是一个很“昂贵”的操作,使用移位操作将会更快更有效。

  例子:

  public class SDIV {

  public static final int NUM = 16;

  public void calculate(int a) {

  int div = a / 4;            // should be replaced with "a >> 2".

  int div2 = a / 8;         // should be replaced with "a >> 3".

  int temp = a / 3;

  }

  }

  更正:

  public class SDIV {

  public static final int NUM = 16;

  public void calculate(int a) {

  int div = a >> 2;

  int div2 = a >> 3;

  int temp = a / 3;       // 不能转换成位移操作

  }

  }

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

  同上。

  [i]但我个人认为,除非是在一个非常大的循环内,性能非常重要,而且你很清楚你自己在做什么,方可使用这种方法。否则提高性能所带来的程序晚读性的降低将是不合算的。

  例子:

  public class SMUL {

  public void calculate(int a) {

  int mul = a * 4;            // should be replaced with "a << 2".

  int mul2 = 8 * a;         // should be replaced with "a << 3".

  int temp = a * 3;

  }

  }

  更正:

  package OPT;

  public class SMUL {

  public void calculate(int a) {

  int mul = a << 2;

  int mul2 = a << 3;

  int temp = a * 3;       // 不能转换

  }

  }


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

  例子:

  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 = 0; i < vector.size(); i++) {

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

  }

  }

  private Vector vector = new Vector (5, 5);

  }

  更正:

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

  import java.util.Vector;

  public class SYN {

  public void method (Object o) {

  }

  private void test () {

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

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

  method (vector.elementAt(i));

  }

  }

  }

  private Vector vector = new Vector (5, 5);

  }

  十三、将try/catch块移出循环

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

  例子:

  import java.io.FileInputStream;

  public class TRY {

  void method (FileInputStream fis) {

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

  try {                                      // violation

  _sum += fis.read();

  } catch (Exception e) {}

  }

  }

  private int _sum;

  }

  更正:

  将try/catch块移出循环

  void method (FileInputStream fis) {

  try {

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

  _sum += fis.read();

  }

  } catch (Exception e) {}

  }

  参考资料:

  Peter Haggar: "Practical Java - Programming Language Guide".

  Addison Wesley, 2000, pp.81 – 83

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值