八如果只是查找单个字符的话用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 –