十四 对于boolean值 避免不必要的等式判断
将一个boolean值与一个true比较是一个恒等 *** 作(直接返回该boolean变量的值) 移走对于boolean的不必要 *** 作至少会带来 个好处
)代码执行的更快 (生成的字节码少了 个字节)
)代码也会更加干净
例子
public class UEQ
{
boolean method (String string) {
return string endsWith ( a ) == true; // Violation
}
}
更正
class UEQ_fixed
{
boolean method (String string) {
return string endsWith ( 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 = string indexOf( index)) != ) {
System out println (string substring(index string length()));
}
}
}
参考资料
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 : ); // pact expression
}
private int _value = ;
}
十九 不要在循环体中实例化变量
在循环体中实例化临时变量将会增加内存消耗
例子
import java util Vector;
public class LOOP {
void method (Vector v) {
for (int i= ;i < v size();i++) {
Object o = new Object();
o = v elementAt(i);
}
}
}
更正
在循环体外定义变量 并反复使用
import java util Vector;
public class LOOP {
void method (Vector v) {
Object o;
for (int i= ;i<v size();i++) {
o = v elementAt(i);
}
}
}
二十 确定 StringBuffer的容量
StringBuffer的构造器会创建一个默认大小(通常是 )的字符数组 在使用中 如果超出这个大小 就会重新分配内存 创建一个更大的数组 并将原先的数组复制过来 再丢弃旧的数组 在大多数情况下 你可以在创建StringBuffer的时候指定大小 这样就避免了在容量不够的时候自动增长 以提高性能
例子
public class RSBC {
void method () {
StringBuffer buffer = new StringBuffer(); // violation
buffer append ( hello );
}
}
更正
为StringBuffer提供寝大小
public class RSBC {
void method () {
StringBuffer buffer = new StringBuffer(MAX);
buffer append ( hello );
}
private final int MAX = ;
}
参考资料
Dov Bulka Java Performance and Scalability Volume : Server Side Programming
Techniques Addison Wesley ISBN: p –
二十一 尽可能的使用栈变量
如果一个变量需要经常访问 那么你就需要考虑这个变量的作用域了 static local还是实例变量?访问静态变量和实例变量将会比访问局部变量多耗费 个时钟周期
例子
public class USV {
void getSum (int[] values) {
for (int i= ; i < value length; i++) {
_sum += value[i]; // violation
}
}
void getSum (int[] values) {
for (int i= ; i < value length; 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 < value length; i++) {
sum += value[i];
}
_sum = sum;
}
vc60好像没有自带的性能测试程序。
vc2010旗舰版有自带的性能测试程序。在菜单-》分析-》启动性能向导。然后有4种监测方式,第一种是推荐使用的CPU采样。它能够监测你的程序运行,然后用报表的方式告诉你,你的程序中,最耗时的函数是哪些。
1返回一个类型的数组跟返回该类型的泛型
一般来说是泛型的性能要高,因为泛型可以避免类型的装箱与拆箱。但具体的还要看你的怎么使用你的类型的。
2、DataSet, DataTable , DataReader三者比较
DataReader最快,但其提供的功能也是最少的。建议不要太多使用DataSet,因为这东西太大了,最好使用Table
3采用分层架构以后跟未分层的项目哪一个性能好些
将一个项目划分过多的层次对性能而言没有任何好处。但有时候项目的分层是必要的,因为一个项目在设计与制作的时候你不可能仅仅考虑它的性能,你还得考虑它的安全性、扩展性等。为了达到这些软件目标,你就得分层设计。
4string a = ""; 与 string b = stringEmpty
string b = stringEmpty的性能要高一些。string尽管被当作基元的值类型使用,但其实它是引用类型的,直接赋值为“”会导致一次内存分配。
以上就是关于Java程序性能优化(3)全部的内容,包括:Java程序性能优化(3)、用c++编程时怎样测试程序的性能;比如空间速度等;详细一些;谢谢!、C# 关于程序性能的几个问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)