提高循環的效率
動不動就是用循環去進行數據的操作,那么我們該如何人去提高循環的效率呢,這里以for循環為例。
嵌套循環的情況
long stratTime = System.nanoTime();
for (int i = 0; i < 10000000; i++) {
for (int j = 0; j < 10; j++) {
}
}
long endTime = System.nanoTime();
System.out.println("外大內小耗時:"+ (endTime - stratTime));
應該修改為:
long stratTime = System.nanoTime();
for (int i = 0; i <10 ; i++) {
for (int j = 0; j < 10000000; j++) {
}
}
long endTime = System.nanoTime();
System.out.println("外小內大耗時:"+(endTime - stratTime));
兩者耗時對比:
外大內小耗時:200192114
外小內大耗時:97995997
我們可以通過結果看出優化后性能提升了一倍,所以嵌套循環應該遵循“外小內大”的原則,這和你拷貝文件的時候復制多個小文件和負責少個大文件的區別。
提取與循環無關的表達式
long stratTime = System.nanoTime();
for (int i = 0; i < 10000000; i++) {
i=i*a*b;
}
應該修改為:
long stratTime = System.nanoTime();
c = a*b;
for (int i = 0; i < 10000000; i++) {
i=i*c;
}
long endTime = System.nanoTime();
System.out.println("已提取耗時:"+(endTime - stratTime));
兩者耗時對比:
未提取耗時:45973050
已提取耗時:1955
代碼中的a*b運算和循環是無關的,所以我們應該把他放到循環的外面,避免重復計算,我們可以看到優化后的性能提升了好幾個量級,這可是不容忽視的效率問題。
消除循環終止判斷時的方法調用
long stratTime = System.nanoTime();
for (int i = 0; i < list.size(); i++) {
}
long endTime = System.nanoTime();
System.out.println("未優化list耗時:"+(endTime - stratTime));
應該為:
long stratTime = System.nanoTime();
int size = list.size();
for (int i = 0; i < size; i++) {
}
long endTime = System.nanoTime();
System.out.println("優化list耗時:"+(endTime - stratTime));
兩者耗時對比:
未優化list耗時:27375
優化list耗時:2444
list.size()每次循環都會被執行一次,這無疑會影響程序的性能,所以應該將其放到循環外面,用一個變量來代替,優化前后的對比也很明顯。
異常捕獲
long stratTime = System.nanoTime();
for (int i = 0; i < 10000000; i++) {
try {
} catch (Exception e) {
}
}
long endTime = System.nanoTime();
System.out.println("在內部捕獲異常耗時:"+(endTime - stratTime));
應改為:
long stratTime = System.nanoTime();
try {
for (int i = 0; i < 10000000; i++) {
}
} catch (Exception e) {
}
long endTime = System.nanoTime();
System.out.println("在外部捕獲異常耗時:"+(endTime - stratTime));
兩者耗時對比:
在內部捕獲異常耗時:12150142
在外部捕獲異常耗時:1955
捕獲異常是很耗資源的,所以不要把try catch放到循環內部,優化后同樣有好幾個數量級的提升。
性能優化的內容有很多,代碼優化只是其中一小部分,我們在日常開發中應養成良好的編碼習慣。希望上面的問答對大家有所幫助!
