如何提高循環的效率


提高循環的效率

動不動就是用循環去進行數據的操作,那么我們該如何人去提高循環的效率呢,這里以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放到循環內部,優化后同樣有好幾個數量級的提升。

性能優化的內容有很多,代碼優化只是其中一小部分,我們在日常開發中應養成良好的編碼習慣。希望上面的問答對大家有所幫助!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM