java關於for循環的效率優化


我們知道在實現一個功能的時候是可以使用不同的代碼來實現的,那么相應的不同實現方法的性能肯定也是有差別的,所以我們在寫一些對性能很敏感的模塊的時候,對代碼進行優化是很必要的,所以我們說一下for循環(while循環同理)的性能優化。

循環作為三大結構之一,我們在編寫代碼的時候使用頻率非常的高;循環結構的重要性也是不言而喻的,他讓我們操作數組、集合和其他一些有規律的事物變得更加的方便,但是如果運用不得當,就會給性能帶來很大的負擔,所以我們需要掌握一些關鍵的技巧優化我們的代碼:

嵌套循環

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放到循環內部,優化后同樣有好幾個數量級的提升。

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


免責聲明!

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



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