首页 > 代码库 > JAVA性能调优-在循环条件中不要使用表达式

JAVA性能调优-在循环条件中不要使用表达式

 

1、JAVA性能调优-在循环条件中不要使用表达式

我们在学习JAVA性能调优的时候,经常能看到这一的一段话:在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。

import java.util.vector;

class cel {

    void method(vector vector) {

        for (int i= 0; i < vector.size (); i++)  //violation

            ; //...

    }

}

 

更正:

class cel_fixed {

    void method(vector vector) {

        int size =vector.size ()

        for (int i= 0; i < size; i++)

            ; //...

    }

}

逻辑上看起来非常有道理,只是效率的提升大概有多少,用代码来测试下:

2、循环条件中是否有表达式对比测试的源代码

package com.java.test;

 

import java.util.ArrayList;

import java.util.List;

/**

 * 使用预热模式

 * JVM参数:-XX:PrintCompilation

 * 目标:测试在循环中,循环条件会被反复计算对性能的影响

 * @author 范芳铭

 */

public class EasyLoopParamTest {

    List<String>aList = new ArrayList<String>();

    public staticvoid main(String[] args) throws Exception{

        intwarmUpCycles = 100000; //预热次数

        inttestCycles   = 200000; //正式执行次数

       

        EasyLoopParamTestse = new EasyLoopParamTest();

 

        System.out.println("...预热循环开始 ...");

        longcomputeTime = se.runComputeParam(warmUpCycles);

        long fixTime= se.runFixParam(warmUpCycles);

        System.out.println("...预热结束");

        System.out.println("...预热阶段,动态计算循环调整的平均耗时: " + computeTime);

        System.out.println("...预热阶段,固定参数的平均耗时:" + fixTime);

       

 

       

        System.out.println("...进入正式循环 ...");

        computeTime= se.runComputeParam(testCycles);

        fixTime =se.runFixParam(testCycles);

        System.out.println("...正式运行阶段,动态计算循环调整的平均耗时: " + computeTime);

        System.out.println("...正式运行阶段,固定参数的平均耗时:" + fixTime);

       

    }

   

    //给队列中加入1万个元素

    publicEasyLoopParamTest(){

        for (inti=0; i< 10000 ; i ++){

            aList.add(String.valueOf(i));

        }

    }

   

    //一个在循环中,循环条件会被反复计算

    private longrunComputeParam(int iterations){

        //开始计时

        longstartTime = System.nanoTime();

 

        for(int loop= 0 ; loop < iterations ;  loop ++){

            for (inti = 0; i < aList.size(); i++){

                //简化内部逻辑

            }

        }

       

        //计时完成

        longelapsedTime = System.nanoTime();

        return(elapsedTime - startTime) / iterations;

    }

   

    //另外一个在循环中,循环条件不变

    public longrunFixParam(int iterations){

        //开始计时

        longstartTime = System.nanoTime();

       

        int size =aList.size();

        for(int loop= 0 ; loop < iterations ;  loop ++){

            for (inti = 0; i < size; i++){

                //简化内部逻辑

            }

        }

       

        //计时完成

        longelapsedTime = System.nanoTime();

        return(elapsedTime - startTime) / iterations;

    }

   

 

}

3、运行结果

...预热循环开始 ...

...预热结束

...预热阶段,动态计算循环调整的平均耗时: 60456

...预热阶段,固定参数的平均耗时: 3537

...进入正式循环 ...

...正式运行阶段,动态计算循环调整的平均耗时: 41578

...正式运行阶段,固定参数的平均耗时: 3493

4、结论

在循环中,循环条件会被反复计算,如果不使用复杂表达式,那么效率的提升是11倍多。

如果在应用中有大量类似的循环,经过这个小小调整,系统的整体性能都会有可观的提升。

 

    

JAVA性能调优-在循环条件中不要使用表达式