1、JAVA性能调优-将try/catch块移出循环
据说把try/catch块放入循环体内,会极大的影响性能。因为使用了try/catch模块的使用,会让JAVA虚拟机做很多额外的工作。就好比对每个人说,“嗨,哥们,路上可能有蛇。于是听到的人只好手拿木棍,小心翼翼的往前走”。
把try/catch块放到循环外面,就好比对一大群人说,“嗨,兄弟们,路上可能有蛇。于是听到的人安排部分人员拿木棍往前走,其他人基本不受影响”
这个理论蛮不错的,测试下对性能的实际影响
2、将try/catch块在循环条件进行比对的源代码
package com.java.test;
import java.util.ArrayList;
import java.util.List;
/**
* 使用预热模式 JVM参数:-XX:PrintCompilation
* 目标:测试在循环中使用try/catch对性能的影响
*
* @author 范芳铭
*/
public class EasyTryCatchTest {
List<String>aList = new ArrayList<String>();
public staticvoid main(String[] args) throws Exception {
intwarmUpCycles = 10000000; //
预热次数
inttestCycles = 50000000; //
正式执行次数
EasyTryCatchTestse = new EasyTryCatchTest();
System.out.println("...预热循环开始 ...");
longcatchTime = se.runCatchLoop(warmUpCycles);
longnotcatchTime = se.runCatchNotLoop(warmUpCycles);
System.out.println("...预热结束");
System.out.println("...预热阶段,try/catch在循环中耗时: " + catchTime);
System.out.println("...预热阶段,try/catch不在循环中耗时: " + notcatchTime);
System.out.println("...进入正式循环 ...");
catchTime =se.runCatchLoop(testCycles);
notcatchTime= se.runCatchNotLoop(testCycles);
System.out.println("...正式运行阶段,try/catch在循环中耗时: " + catchTime);
System.out.println("...正式运行阶段,try/catch不在循环中耗时: " + notcatchTime);
}
publicEasyTryCatchTest(){
aList.add("0");
}
// try / catch 在具体的循环体(内圈 循环 )中
private longrunCatchLoop(int iterations) {
// 开始计时
longstartTime = System.nanoTime();
for (intloop = 0; loop < iterations; loop++) {
try {
Stringtemp = aList.get(0);
} catch(Exception e) {}
}
// 计时完成
longelapsedTime = System.nanoTime();
return(elapsedTime - startTime);
}
// try / catch 在不在具体的循环体(内圈 循环 )中
public longrunCatchNotLoop(int iterations) {
// 开始计时
longstartTime = System.nanoTime();
try {
for (intloop = 0; loop < iterations; loop++) {
Stringtemp = aList.get(0);
}
} catch(Exception e) {}
// 计时完成
longelapsedTime = System.nanoTime();
return(elapsedTime - startTime);
}
}
3、运行结果
...预热循环开始 ...
...预热结束
...预热阶段,try/catch在循环中耗时: 76507316
...预热阶段,try/catch不在循环中耗时: 76292613
...进入正式循环 ...
...正式运行阶段,try/catch在循环中耗时: 389151690
...正式运行阶段,try/catch不在循环中耗时: 389874615
4、结论
从测试结果来看,可能我们的JDK(1.6)会自动优化字节码的缘故,因此try/catch是否在循环中,对整体性能的影响几乎微乎其微,389151690 389874615 差距非常的小。
因此,在实际工作中,可以考虑根据实际需要,把try catch块放在需要的地方。