java性能優化之for循環


今天就來說一下Java代碼優化的事情,今天主要聊一下對於for(while等同理)循環的優化。

 

作為三大結構之一的循環,在我們編寫代碼的時候會經常用到。循環結構讓我們操作數組、集合和其他一些有規律的事物變得更加的方便,但是如果我們在實際開發當中運用不合理,可能會給程序的性能帶來很大的影響。所以我們還是需要掌握一些技巧來優化我們的代碼的。

 

嵌套循環

 

[java]  view plain  copy
 
  1. stratTime = System.nanoTime();  
  2. for (int i = 0; i < 10000000; i++) {  
  3.     for (int j = 0; j < 10; j++) {  
  4.           
  5.     }  
  6. }  
  7. endTime = System.nanoTime();  
  8. System.out.println("外大內小耗時:"+ (endTime - stratTime));         

 

 

應改為:

 

[java]  view plain  copy
 
  1. stratTime = System.nanoTime();  
  2. for (int i = 0; i <10 ; i++) {  
  3.     for (int j = 0; j < 10000000; j++) {  
  4.           
  5.     }  
  6. }  
  7. endTime = System.nanoTime();  
  8. System.out.println("外小內大耗時:"+(endTime - stratTime));  


兩者耗時對比:

 

 

[plain]  view plain  copy
 
  1. 外大內小耗時:200192114  
  2. 外小內大耗時:97995997  

 

 

由以上對比可知,優化后性能提升了一倍,嵌套循環應該遵循“外小內大”的原則,這就好比你復制很多個小文件和復制幾個大文件的區別。

 

提取與循環無關的表達式

 

[java]  view plain  copy
 
  1. stratTime = System.nanoTime();  
  2. for (int i = 0; i < 10000000; i++) {  
  3.     i=i*a*b;  
  4. }  
  5. endTime = System.nanoTime();  
  6. System.out.println("未提取耗時:"+(endTime - stratTime));  


應改為:

 

 

[java]  view plain  copy
 
  1. stratTime = System.nanoTime();  
  2. c = a*b;  
  3. for (int i = 0; i < 10000000; i++) {  
  4.     i=i*c;  
  5. }  
  6. endTime = System.nanoTime();  
  7. System.out.println("已提取耗時:"+(endTime - stratTime));  



 

兩者耗時對比:

 

[plain]  view plain  copy
 
  1. 未提取耗時:45973050  
  2. 已提取耗時:1955  

 

 

代碼中a+b與我們的循環無關,所以應該把它放到外面,避免重復計算,可以看出,優化后性能提升了好幾個數量級,這些是不容忽視的。

 

消除循環終止判斷時的方法調用

 

[java]  view plain  copy
 
  1. stratTime = System.nanoTime();  
  2. for (int i = 0; i < list.size(); i++) {  
  3.       
  4. }  
  5. endTime = System.nanoTime();  
  6. System.out.println("未優化list耗時:"+(endTime - stratTime));  



 

應改為:

 

[java]  view plain  copy
 
  1. stratTime = System.nanoTime();  
  2. int size = list.size();  
  3. for (int i = 0; i < size; i++) {  
  4.       
  5. }  
  6. endTime = System.nanoTime();  
  7. System.out.println("優化list耗時:"+(endTime - stratTime));  


兩者耗時對比:

 

 

[plain]  view plain  copy
 
  1. 未優化list耗時:27375  
  2. 優化list耗時:2444  



 

list.size()每次循環都會被執行一次,這無疑會影響程序的性能,所以應該將其放到循環外面,用一個變量來代替,優化前后的對比也很明顯。

 

異常捕獲

 

[java]  view plain  copy
 
  1. stratTime = System.nanoTime();  
  2. for (int i = 0; i < 10000000; i++) {  
  3.     try {  
  4.     } catch (Exception e) {  
  5.     }  
  6. }  
  7. endTime = System.nanoTime();  
  8. System.out.println("在內部捕獲異常耗時:"+(endTime - stratTime));  


應改為:

 

 

[html]  view plain  copy
 
  1. stratTime = System.nanoTime();  
  2. try {  
  3.     for (int i = 0; i 10000000; i++) {  
  4.     }  
  5. } catch (Exception e) {  
  6.   
  7. }  
  8. endTime = System.nanoTime();  
  9. System.out.println("在外部捕獲異常耗時:"+(endTime - stratTime));  

 

兩者耗時對比:

 

[plain]  view plain  copy
 
  1. 在內部捕獲異常耗時:12150142  
  2. 在外部捕獲異常耗時:1955  


大家都知道,捕獲異常是很耗資源的,所以不要講try catch放到循環內部,優化后同樣有好幾個數量級的提升。

 

 

性能優化的內容有很多,代碼優化只是其中一小部分,我們在日常開發中應養成良好的編碼習慣。接下來會跟大家探討更多關於性能優化的內容,希望大家積極交流指導。


免責聲明!

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



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