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 {

ListaList = new ArrayList();

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块放在需要的地方。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐