国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

java性能優化筆記 —— for循環

pkhope / 986人閱讀

摘要:異常捕獲在內部捕獲異常耗時優化后在外部捕獲異常耗時結論捕獲異常是很耗資源的,所以不要講放到循環內部。

1.多層嵌套循環
stratTime = System.nanoTime();  
for (int i = 0; i <10000 ; i++) {  
    for (int j = 0; j < 100; j++) {
        for (int k = 0; k < 10; k++) {  
            testFunction(i, j, k);
        }
    }
}
System.out.println("外大內小耗時:"+ (endTime - stratTime));  

優化后:

stratTime = System.nanoTime();  
for (int i = 0; i <10 ; i++) {  
    for (int j = 0; j < 100; j++) {
        for (int k = 0; k < 10000; k++) {  
            testFunction(i, j, k);
        }
    }
}
endTime = System.nanoTime();  
System.out.println("外小內大耗時:"+(endTime - stratTime)); 

兩者耗時對比:

外大內小耗時:1582127649  
外小內大耗時:761666633  
優化原理

我們先分析原代碼循環變量在實例化、初始化、比較、自增等方面的耗時情況:

優化前:

變量 實例化(次數) 初始化(次數) 比較(次數) 自增(次數)
i 1 1 10000 10000
j 10000 10000 10000*100 10000*100
k 10000*100 10000*100 1000010010 1000010010

優化后:

變量 實例化(次數) 初始化(次數) 比較(次數) 自增(次數)
i 1 1 10 10
j 10 10 10*100 10*100
k 10*100 10*100 1010010000 1010010000
結論

嵌套循環應該遵循“外小內大”的原則

2.循環變量的實例化應放在循環外

在1.中優化后的代碼基礎上,進行二次優化:

stratTime = System.nanoTime();  
int i, j, k;
for (i = 0; i <10 ; i++) {  
    for (j = 0; j < 100; j++) {
        for (k = 0; k < 10000; k++) {  
            testFunction(i, j, k);
        }
    }
}
endTime = System.nanoTime();  
System.out.println("提取出循環內變量后耗時:"+(endTime - stratTime));

結果如下:

 外小內大耗時:761666633  
 提取出循環內變量后耗時:748479323
 

優化并不明顯,但是當循環越大時,耗時會差距更大

## 優化原理
優化后:

變量 實例化(次數) 初始化(次數) 比較(次數) 自增(次數)
i 1 1 10 10
j 1 10 10*100 10*100
k 1 10*100 1010010000 1010010000
結論

循環變量的實例化應該盡量放在循環外進行

3.提取與循環無關的表達式
stratTime = System.nanoTime();  
for (int i = 0; i < 10000000; i++) {  
    i=i*a*b;  
}  
endTime = System.nanoTime();  
System.out.println("未提取耗時:"+(endTime - stratTime)); 

優化后:

stratTime = System.nanoTime();  
c = a*b;  
for (int i = 0; i < 10000000; i++) {  
    i=i*c;  
}  
endTime = System.nanoTime();  
System.out.println("已提取耗時:"+(endTime - stratTime));  
結論:

代碼中a+b與我們的循環無關,所以應該把它放到外面,避免重復計算。

4.消除循環終止判斷時的方法調用
stratTime = System.nanoTime();  
for (int i = 0; i < list.size(); i++) {  
      
}  
endTime = System.nanoTime();  
System.out.println("未優化list耗時:"+(endTime - stratTime));
 

優化后:

stratTime = System.nanoTime();  
int size = list.size();  
for (int i = 0; i < size; i++) {  
      
}  
endTime = System.nanoTime();  
System.out.println("優化list耗時:"+(endTime - stratTime));
結論

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

5.異常捕獲
 stratTime = System.nanoTime();  
for (int i = 0; i < 10000000; i++) {  
    try {  
    } catch (Exception e) {  
    }  
}  
endTime = System.nanoTime();  
System.out.println("在內部捕獲異常耗時:"+(endTime - stratTime));

優化后:

stratTime = System.nanoTime();  
try {  
    for (int i = 0; i < 10000000; i++) {  
    }  
} catch (Exception e) {  
  
}  
endTime = System.nanoTime();  
System.out.println("在外部捕獲異常耗時:"+(endTime - stratTime));
結論

捕獲異常是很耗資源的,所以不要講try catch放到循環內部。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68134.html

相關文章

  • 程序員筆記|如何編寫高性能Java代碼

    摘要:常見標高線程上下文切換頻繁線程太多鎖競爭激烈標高如果的占用很高,排查涉及到的程序,比如把改造成。抖動問題原因字節碼轉為機器碼需要占用時間片,大量的在執行字節碼時,導致長期處于高位現象,占用率最高解決辦法保證編譯線程的占比。 一、并發 Unable to create new native thread …… 問題1:Java中創建一個線程消耗多少內存? 每個線程有獨自的棧內存,共享堆內...

    ky0ncheng 評論0 收藏0
  • 讀書筆記(03) - 性能 - JavaScript高級程序設計

    摘要:作用域鏈查找作用域鏈的查找是逐層向上查找。而全局變量和閉包則會與之相反,繼續保存,所以使用用后需手動標記清除,以免造成內存泄漏。獲取元素的屬性獲取元素的屬性等參考文檔高級程序設計作者以樂之名本文原創,有不當的地方歡迎指出。 showImg(https://segmentfault.com/img/bVburXV?w=500&h=399); 作用域鏈查找 作用域鏈的查找是逐層向上查找。查...

    warnerwu 評論0 收藏0
  • JS性能優化筆記

    摘要:四如果需要遍歷數組,應該先緩存數組長度,將數組長度放入局部變量中,避免多次查詢數組長度。五盡量選用局部變量而不是全局變量。所以如果這樣的表達式重復出現,只要可能,應該盡量少出現這樣的表達式,可以利用局部變量,把它放入一個臨時的地方進行查詢。 通過網上查找資料了解關于性能優化方面的內容,現簡單整理,僅供大家在優化的過程中參考使用,如有什么問題請及時提出,再做出相應的補充修改。 一、 讓...

    baoxl 評論0 收藏0
  • java筆記

    摘要:沒有被引用和沒有被使用是兩碼事。對這一段代碼如何做出優化盡量的在里面少創建對象。那么這一萬條數據循環然后反序列化變成,性能就回很低。 1.沒有被引用和沒有被使用是兩碼事。 javapublic List getConcernListByUserId(String userId) { List myBlackLists= this.getMyBlackListByUse...

    xi4oh4o 評論0 收藏0
  • Java8實戰》-讀書筆記第一章(02)

    摘要:實戰讀書筆記第一章從方法傳遞到接著上次的,繼續來了解一下,如果繼續簡化代碼。去掉并且生成的數字是萬,所消耗的時間循序流并行流至于為什么有時候并行流效率比循序流還低,這個以后的文章會解釋。 《Java8實戰》-讀書筆記第一章(02) 從方法傳遞到Lambda 接著上次的Predicate,繼續來了解一下,如果繼續簡化代碼。 把方法作為值來傳遞雖然很有用,但是要是有很多類似與isHeavy...

    lushan 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<