循環作爲三大結構之一,我們在編寫代碼的時候使用頻率非常的高;循環結構的重要性也是不言而喻的,他讓我們操作數組、集合和其他一些有規律的事物變得更加的方便,但是如果運用不得當,就會給性能帶來很大的負擔,所以我們需要掌握一些關鍵的技巧優化我們的代碼:
嵌套循環
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 endTime = System.nanoTime();
System.out.println("未提取耗時:"+(endTime - stratTime));
應改爲:
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放到循環內部,優化後同樣有好幾個數量級的提升。
性能優化的內容有很多,代碼優化只是其中一小部分,我們在日常開發中應養成良好的編碼習慣。希望上面的問答對大家有所幫助!
本人轉自:https://www.cnblogs.com/lei-z/p/14086042.html