Java程序性能优化—十年码农总结的编程小技巧

来源:http://www.sh-fengwen.com 作者:鲜果干果 人气:173 发布时间:2019-09-06
摘要:程序的性能受代码质量的直接影响。在本文中,主要介绍一些代码编写的小技巧和惯例,这些技巧有助于在代码级别上提升系统性能。 多线程、集合、网络编程、内存优化、缓冲、、

程序的性能受代码质量的直接影响。在本文中,主要介绍一些代码编写的小技巧和惯例,这些技巧有助于在代码级别上提升系统性能。

多线程、集合、网络编程、内存优化、缓冲、、spring、设计模式、软件工程、编程思想

1、慎用异常

1、生成对象时,合理分配空间和大小
new ArrayList(100);

在Java软件开发中,经常使用 try-catch 进行错误捕获,但是,try-catch 语句对系统性能而言是非常糟糕的。虽然在一次 try-catch中,无法察觉到它对性能带来的损失,但是,一旦try-catch被应用于循环之中,就会给系统性能带来极大的伤害。

2、优化for循环
Vector vect = new Vector(1000);
for( inti=0; i<vect.size(); i++){
...
}
for循环部分改写成:
int size = vect.size();
for( int i=0; i>size; i++){
...
}
如果size=1000,就可以减少1000次size()的系统调用开销,避免了循环体重复调用。

以下是一段将try-catch应用于for循环内的示例

3、new一个实例对象,new在什么位置(尽量在使用时再创建该对象)。

图片 1

4、异常处理技巧

这段代码我运行时间是 27211 ms。如果将try-catch移到循环体外,那么就能提升系统性能,如下代码

5、尽量使用局部变量和静态变量

图片 2

6、尽量不适用多线程同步

运行耗时 15647 ms。可见tyr-catch对系统性能的影响。

7、尽可能的使用Java自身提供的API

2、使用局部环境

8、尽量减少I/O操作(控制台、日志)

调用方法时传递的参数以及在调用中创建的临时变量都保存在栈中,速度较快。其他变量,如静态变量、实例变量等,都在堆中创建,速度较慢。

9、尽量使用缓存流(尽可能使用带有Buffer的类代替没有Buffer的类,BufferedReader、BufferedWriter、BufferedInputStream)

下面是一段测试用例

10、sql优化、存储过程、视图、连接池(C3P0 、DBCP)

// private static int a = 0;

public static void main(String[] args) { int a = 0; long start = System.currentTimeMillis(); for (int i = 0; i < 1000000; i++) {

a = a + 1;

System.out.println;

}

System.out.println(System.currentTimeMillis() - start);

}

11、数据库数据分级存储
将经常访问的数据和访问频度低的数据,分别存放到不同的分区,甚至存放到不同的数据库服务器,以便合进分配硬盘I/O及系统I/O。

运行结果很明显,使用静态变量耗时15677ms,使用局部变量耗时13509ms。由此可见,局部变量的访问速度高于类的成员变量。

12、缓存策略
如果有些数据要经常要从数据库中读取,同时,这些数据又不经常变化,这些数据就可以在系统中缓存起来,使用时直接读取缓存,而不用频繁的访问数据库读取数据。
缓存工作可以在系统初始化时一次性读取数据,特别是一些只读的数据,当数据更新时更新数据库内容,同时更新缓存的数据值。
Java常用的缓存技术产品有:Redis、MemoryCache、OSCache等。

3、位运算代替乘除法

13、html静态化

在所有的运算中,位运算是最为高效的。因此,可以尝试使用位运算代替部分算术运算,来提高系统的运行速度。

14、不用保存太多的信息在HttpSession中

比如在HashMap的源码中使用了位运算

15、在使用大数据对象时,因此建议在对象使用完毕后,手动设置成null(避免内存溢出)。

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

static final int MAXIMUM_CAPACITY = 1 << 30;

对于整数的乘除运算优化

a*=2

a/=2

用位运算可以写为

a<<=1a>>=1

4、替换switch

关键字 switch 语句用于多条件判断, switch 语句的功能类似于 if-else 语句,两者性能也差不多。因此,不能说 switch 语句会降低系统的性能。但是,在绝大部分情况下,switch 语句还是有性能提升空间的。

来看下面的例子:

public static void main(String[] args) { long start = System.currentTimeMillis(); int re = 0; for (int i = 0;i<1000000;i++){

re = switchInt;

System.out.println;

}

System.out.println(System.currentTimeMillis() - start+"毫秒");//17860

} public static int switchInt{ int i = z%10+1; switch { case 1:return 3; case 2:return 6; case 3:return 7; case 4:return 8; case 5:return 10; case 6:return 16; case 7:return 18; case 8:return 44; default:return -1;

}

}

就分支逻辑而言,这种 switch 模式的性能并不差。但是如果换一种新的思路替代switch,实现相同的程序功能,性能就能有很大的提升空间。

public static void main(String[] args) { long start = System.currentTimeMillis(); int re = 0; int[] sw = new int[]{0,3,6,7,8,10,16,18,44}; for (int i = 0;i<1000000;i++){

re = arrayInt;

System.out.println;

}

System.out.println(System.currentTimeMillis() - start+"毫秒");//12590

}

public static int arrayInt( int[] sw,int z){ int i = z%10+1; if (i>7 || i<1){ return -1;

}else { return sw[i];

}

}

以上代码使用全新的思路,使用一个连续的数组代替了 switch 语句。因为对数据的随机访问是非常快的,至少好于 switch 的分支判断。通过实验,使用switch的语句耗时17860ms,使用数组的实现只耗时12590ms,提升了5s多。在软件开发中,换一种思路可能会取得更好的效果,比如使用数组替代switch语句就是就是一个很好的例子。在此我向大家推荐一个架构学习交流裙。交流学习裙号:821169538,里面会分享一些资深架构师录制的视频录像

5、一维数组代替二维数组

由于数组的随机访问的性能非常好,许多JDK类库,如ArrayList、Vector等都是使用了数组作为其数组实现。但是,作为软件开发人员也必须知道,一位数组和二维数组的访问速度是不一样的。一位数组的访问速度要优于二维数组。因此,在性能敏感的系统中要使用二维数组的,可以尝试通过可靠地算法,将二维数组转为一维数组再进行处理,以提高系统的响应速度。

6、提取表达式

在软件开发过程中,程序员很容易有意无意让代码做一些“重复劳动”,在大部分情况下,由于计算机的告诉运行,这些“重复劳动”并不会对性能构成太大的威胁,但若将系统性能发挥到极致,提取这些“重复劳动”相当有意义。

来看下面的测试用例:

本文由美高梅游戏平台网站发布于鲜果干果,转载请注明出处:Java程序性能优化—十年码农总结的编程小技巧

关键词:

上一篇:越来越多的Java程序员转行Java大数据...

下一篇:没有了

最火资讯