J2EE性能优化(一)

时间:2021-08-11 21:03:59

  用java进行开发,尤其是一些大型企业项目,性能调优的工作很重要。在设计应用程序的时候,应该始终把性能放在考虑范围内。一些应用程序设计中的不当做法,在小数据量,执行次数少的情况下,可能对性能造成的影响并不明显。但是在大数据量、大量重复执行的生产环境中,对性能却会造成明显的负面影响。


(一)String操作


  用StringBuffer.append来代替String+=累加;如下边的这段代码:


<span style="font-family:SimSun;font-size:18px;">String result = "";
for (int i = 0; i < 20; i++) {
result += getNextString();
}</span>


  javac 会将其编译成类似下面的代码:

<span style="font-family:SimSun;font-size:18px;">String result = "";
for (int i=0; i < 20; i++) {
result = new StringBuffer().append(result)
.append(getNextString())
.toString();
}</span>
<span style="font-family:SimSun;font-size:18px;">  从上面的代码可以看到,每次循环都会创建两个对象,一个是 StringBuffer,一个是 toString 产生的 String 对象。如果循环次数或数据量很大的时候,这种做法对性能的影响很明显。应该改成下面的做法:</span>
<span style="font-family:SimSun;font-size:18px;"></span>
<span style="font-family:SimSun;font-size:18px;">String result = "";StringBuffer buffer = new StringBuffer();for (int i = 0; i < 20; i++) {buffer.append(getNextString());}result = buffer.toString();</span>

(二)日期操作


  我们应该使用如下代码来实现日期输出格式的国际化:

<span style="font-family:SimSun;font-size:18px;">Date dateTest=new Date();
//用来显示某一个时间的中文格式
SimpleDateFormat df = new SimpleDateFormat("yyyy 年 MM 月 dd 日");
String timevalue = df.format(dateTest);
// 用来显示某一个时间的其它国家格式
DateFormat fmt=DateFormat.getDateInstance(DateFormat.MEDIUM,
new Locale("en","US"));
String newprintformat1 = fmt.format(dateTest);</span>


  而不是用这样的代码,如:

<span style="font-family:SimSun;font-size:18px;">//  不要使用如下代码.
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String timevalue = df.format(data);
String year_num = timevalue.substring(0, 4);
String month_num = timevalue.substring(5, 7);
String day_num = timevalue.substring(8, 10);
String newprintformat = year_num + " 年"
+ month_num + " 月"
+ day_num + " 日";</span>

(三)异常


  慎用异常,异常抛出对性能不利。抛出异常首先要创建一个新的对象。Throwable 接口的构造函数调用名为 fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法检查堆栈,收集调用跟踪信息。只要有异常被抛出,VM 就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。而且,千万不要在finally中抛出异常,否则会湮没之前的异常, 给代码的debug造成很大困难。