使用循环语句的几个建议

1.当做数组拷贝操作时,采用System.arraycopy()方法完成拷贝操作要比采用循环的方法完成数组拷贝操作效率高。如下:

public class ArrayCopyTest {
    public static void main(String args[]) {
        long startIndex, endIndex;
        int[] a = new int[2500000];
        int[] b = new int[2500000];
        for(int i=0; i<a.length; i++) {
            a[i] = i;
        }
        startIndex = System.currentTimeMillis();
        for(int j=0; j<a.length; j++) {
            b[j] = a[j];
        }
        endIndex = System.currentTimeMillis();
        System.out.println(endIndex - startIndex + " milli seconds for loop copy");
        int[] c = new int[2500000];
        startIndex = System.currentTimeMillis();
        System.arraycopy(a,0,c,0,c.length);
        endIndex = System.currentTimeMillis();
        System.out.println(endIndex - startIndex + " milli seconds for System.arraycopy()");
    }
} 

2.尽量避免在循环体中调用方法,因为方法调用是比较昂贵的。

3.最好避免在循环体内存取数组元素,比较好的办法是在循环体内采用临时变量,在循环体外更改数组的值。这时因为在循环体内使用变量比存取数组元素要快。

4.当没有使用JIT或HotSpot虚拟机时,尽量使用0值作为终结条件的比较元素,以提高循环语句的性能,例如:

public class ZeroCompareTest
{
    public static void main(String args[])
    {
        long startIndex, endIndex;
        int[] a = new int[2500000];
        startIndex = System.currentTimeMillis();
        for(int i=0; i<a.length; i++) {
            a[i] += i;
        }
        endIndex = System.currentTimeMillis();
        System.out.println(endIndex - startIndex +
            " milli seconds(not useing zero compare)");
        int[] b = new int[2500000];
        startIndex = System.currentTimeMillis();
        for(int i=b.length-1; i>=0; i--) {
            b[i] += i;
        }
        endIndex = System.currentTimeMillis();
        System.out.println(endIndex - startIndex +
            " milli seconds(useing zero compare)");
    }
}

 

5.尽量避免在循环体中使用try-catch块,最好在循环体外使用try-catch块(包住循环体)以提高系统性能。

6.在多重循环中,如果有可能,尽量将最长的循环放在最内层,最短的循环放在最外层,以减少循环层间的切换次数。

7.如果循环体内有if-else类逻辑判断,并且循环次数很大,最好将if-else类逻辑判断移到循环体之外,以提高应用性能。如:
for(i=0; i<1000000; i++)
{
    if(isTure)
    {
        doThis();
    }
    else
    {
        doThat();
    }
}
最好改为:
if(isTure)
{
    for(i=0; i<1000000; i++)
    {
        doThis();
    }
}
else
{
    for(i=0; i<1000000; i++)
    {
        doThat();
    }
}

参考资料:《Java优化编程》

posted @ 2010-07-29 16:20  MikeLin  阅读(678)  评论(0)    收藏  举报