Java程序性能优化(3)

Java程序性能优化(3),第1张

十四 对于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# 关于程序性能的几个问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9305668.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存