摘要:
作为一名程序员,不仅要会写代码,更要会写高效的代码;在提高代码运行速度上。这里给大家介绍一些提高Java代码性能的小技巧。这里的一些优化技巧可能执行一次无法让你察觉它的优势,当你对其运行个上万次,就能发现性能是有极大的改善的。
- 慎用异常
Java开发中,经常使用try-catch捕获异常,但是try-catch对系统性能而言是非常糟糕的。可能一次try-catch让你无法察觉,但是如果把try-catch放在循环之中,那么你的程序性能就会下降得飞快。
一般代码:
int a = 0;
for (int i = 0; i < 100000000; i++){
try {
a++;
}catch (Exception e){
}
}
优化后代码:
int a = 0;
try {
for (int i = 0; i < 100000000; i++){
a++;
}
}catch (Exception e){
}
- 使用局部变量
调用方法时传递的参数在调用中创建的临时变量是创建在栈里面的,如果是静态变量,实例变量,都是在堆中创建的,创建和获取的速度较慢
一般代码
public static int a = 0; //在类中定义
for (long i = 0; i < 100000000; i++){
a++;
}
优化代码:
int a = 0; //方法中定义
for (long i = 0; i < 100000000; i++){
a++;
}
- 使用位运算代替乘除法
在所有运算中,位运算是最快的,所以当需要用到乘除法的时候可以考虑用位运算代替
//普通代码
long a = 100;
for(int i = 0; i < 100000000; i++){
a*=2;
a/=2;
}
//优化代码:
for(int i = 0; i < 100000000; i++){
a <<= 1;
a >>= 1;
}
- 用一维数组代替二维数组
在数据量大的时候你会发现,二维数组和一维数组运行完全一样的功能,二维数组所花的时间是一维数组的两倍多。
//二维数组
int[][] doubleArray = new int[100][100];
for (int k = 0; k < doubleArray.length; k++){
for (int j = 0; j < doubleArray[0].length; j++){
doubleArray[k][j] = j;
}
}
//跟上面二维数组等价的一维数组
int[] array = new int[1000000];
int re = 0;
for (int k = 0; k < array.length; k++){
array[k] = k;
}
//优化代码,加循环放大后测试两者性能相差两倍多
- 替换重复代码 && 提取表达式
通过多定义变量,减少重复的运算
//二维数组
int[][] doubleArray = new int[100][100];
//提取重复的代码
int row = doubleArray.length;
int col = doubleArray[0].length;
for (int k = 0; k < row; k++){
for (int j = 0; j < col; j++){
doubleArray[k][j] = j;
}
}
//优化代码,提取重复代码
for(int i = 0; i < 100000; i++){
x = a * b * c * d;
y = a * b * c / d; //a、b、c、d是随机数,每次进循环都不一样
}
//提取前面的相同表达式,进行优化
for(int i = 0; i < 100000; i++){
t = a * b * c;
x = t * d;
y = t / d; //a、b、c、d是随机数,每次进循环都不一样
}
- 布尔运算代替位运算
Java对布尔运算有优化,当使用 && 的时候,只要前面的逻辑为false,后面的就不会再执行,同理,使用 || 的时候一样
boolean a = false;
boolean b = true;
int d = 0;
//位运算
for (int i = 0; i < 1000000; i++){
if (a & b & "JavaScript".contains("Java")){
d++;
}
}
//布尔运算,优化的方案
for (int i = 0; i < 1000000; i++){
if (a && b && "JavaScript".contains("Java")){
d++;
}
}
- 使用arrayCopy()函数来进行数组复制
该函数是native函数,Java通过调用操作系统的api来实现(通常来说,native方法优于普通的函数方法,优先使用native方法)
int[] oldArray = new int[10000000];
int n = oldArray.length;
int[] newArray = new int[n];
for (int i = 0 ; i < n; i++){
//调用native方法
System.arraycopy(oldArray, 0, newArray, 0, n);
}