使用循环语句的几个建议
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优化编程》
浙公网安备 33010602011771号