摘要:異常捕獲在內部捕獲異常耗時優化后在外部捕獲異常耗時結論捕獲異常是很耗資源的,所以不要講放到循環內部。
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
摘要:常見標高線程上下文切換頻繁線程太多鎖競爭激烈標高如果的占用很高,排查涉及到的程序,比如把改造成。抖動問題原因字節碼轉為機器碼需要占用時間片,大量的在執行字節碼時,導致長期處于高位現象,占用率最高解決辦法保證編譯線程的占比。 一、并發 Unable to create new native thread …… 問題1:Java中創建一個線程消耗多少內存? 每個線程有獨自的棧內存,共享堆內...
摘要:作用域鏈查找作用域鏈的查找是逐層向上查找。而全局變量和閉包則會與之相反,繼續保存,所以使用用后需手動標記清除,以免造成內存泄漏。獲取元素的屬性獲取元素的屬性等參考文檔高級程序設計作者以樂之名本文原創,有不當的地方歡迎指出。 showImg(https://segmentfault.com/img/bVburXV?w=500&h=399); 作用域鏈查找 作用域鏈的查找是逐層向上查找。查...
摘要:實戰讀書筆記第一章從方法傳遞到接著上次的,繼續來了解一下,如果繼續簡化代碼。去掉并且生成的數字是萬,所消耗的時間循序流并行流至于為什么有時候并行流效率比循序流還低,這個以后的文章會解釋。 《Java8實戰》-讀書筆記第一章(02) 從方法傳遞到Lambda 接著上次的Predicate,繼續來了解一下,如果繼續簡化代碼。 把方法作為值來傳遞雖然很有用,但是要是有很多類似與isHeavy...
閱讀 2609·2021-11-18 10:02
閱讀 2279·2021-09-30 09:47
閱讀 1745·2021-09-27 14:01
閱讀 3110·2021-08-16 11:00
閱讀 3163·2019-08-30 11:06
閱讀 2392·2019-08-29 17:29
閱讀 1532·2019-08-29 13:19
閱讀 445·2019-08-26 13:54