改善性能的技巧
◆ ◆ ◆ ◆
不管有多少经验,都会被问到一些优化建议,从代码层面到数据库层面,下面介绍一些改善性能的小技巧
慎用异常
◆ ◆ ◆ ◆
在开发中,经常使用try-catch进行错误捕获,但是try-catch对系统性能是很糟糕的。一定要注意:
- 在循环语句中,尽量不要使用try-catch
- 如果无法处理某个异常,不要捕获它
- 在最靠近异常抛出的地方捕获异常,不要大段代码的捕获。
- 捕获有特殊意义的异常,如SqlException,而不是简单的Exception
使用局部变量
◆ ◆ ◆ ◆
调用方法时传递参数以及在调用中创建的临时变量都保存在栈中,速度较快。其他变量,如静态变量,在堆中,速度较慢;
如:
int a=0
for(int 1=0;i<100000000;i )
a ;
public static int ta = 0;
for(int 1=0;i<100000000;i )
ta ;
在测试时,代码1的速度是68ms,第二段是256ms,远远大于代码1
位运算代替乘除法
◆ ◆ ◆ ◆
计算机中,位运算是最高效的,可以 尝试使用位运算来代替乘除法,
如
long a =100;
for(int 1=0;i<100000000;i ){
a*=2;
a/=2;
}
改成
long a =100;
for(int 1=0;i<100000000;i ){
a<<=1;//乘以2
a>>=1;//除以2
}
替换switch
◆ ◆ ◆ ◆
switch语句用于多条件判断,类似于if-else。
如
int re=0;
for(int 1=0;i<100000000;i ){
re=swtichInt(i);
}
int switchInt(int z){
int i=z%3 1;
switch(i){
case 1:return 3;
case 2:return 5;
case 3:return 7;
default:return -1;
}
}
改为
int re=0;
int [] sw = new int{3,5,7};
for(int 1=0;i<100000000;i ){
re=arrayInt(sw,i);
}
int arrayInt(int [] sw,int z){
int i=z%3 1;
if(i<1||i>3) return -1;
else return sw[i];
}
数组的随机访问非常快,使用连续的数组代替switch语句,能够明显提高速度
提取表达式
◆ ◆ ◆ ◆
避免让代码做重复运算
如:
double d=Math.random();
double a=Math.random();
double b=Math.random();
double e=Math.random();
double x,y;
for(int 1=0;i<100000000;i ){
x=d*a*b/3*4*a;
y=e*a*b/3*4*a;
}
其中,两个运算的后半部分是相同的,意味着相同的表达式被重复计算了,可改进为:
for(int 1=0;i<100000000;i ){
t=a*b/3*4*a;
x=d*t;
y=e*t;
}
展开循环
◆ ◆ ◆ ◆
这个不是必要的,因为会影响代码的可读性,但是如果是需要提高性能的话,可以尝试考虑。
如
int [] array = new int [100000000];
for(int 1=0;i<100000000;i ){
array[i]=i;
}
更改为
for(int 1=0;i<100000000;i =3){
array[i]=i;
array[i 1]=i 1;
array[i 2]=i 2;
}
实际测试的时候,第一段的时间为101ms,第二段的时间为34ms
使用arrayCopy()
◆ ◆ ◆ ◆
System.arraycopy()是native函数,性能优于普通函数,遇到数组复制时,尽量使用它
如:
System.arraycopy(array,0,array2,0,size)
静态方法代替实例方法
◆ ◆ ◆ ◆
使用static关键字描述的方法为静态方法。在java中,实例方法需要维护一张表以视线对多态的支持,在调用时需要更多资源。所以对于一些常用的工具类方法,没有对其重载的必要时,就声明为static,加速调用。调用静态方法时,也不需要生成类的实例,调用也方便一些。
- end -
祝各位人人都能涨20K!
每个人都是技术大牛!
点击关注,不要走开哟~
- TEN END -