首页 > 代码库 > JAVA性能调优- try/catch块和循环

JAVA性能调优- try/catch块和循环

 

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

 

    

JAVA性能调优- try/catch块和循环