使用循环语句的几个建议
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优化编程》