摘要:異常捕獲在內(nèi)部捕獲異常耗時優(yōu)化后在外部捕獲異常耗時結(jié)論捕獲異常是很耗資源的,所以不要講放到循環(huán)內(nèi)部。
1.多層嵌套循環(huán)
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("外大內(nèi)小耗時:"+ (endTime - stratTime));
優(yōu)化后:
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("外小內(nèi)大耗時:"+(endTime - stratTime));
兩者耗時對比:
外大內(nèi)小耗時:1582127649 外小內(nèi)大耗時:761666633優(yōu)化原理
我們先分析原代碼循環(huán)變量在實例化、初始化、比較、自增等方面的耗時情況:
優(yōu)化前:
變量 | 實例化(次數(shù)) | 初始化(次數(shù)) | 比較(次數(shù)) | 自增(次數(shù)) |
---|---|---|---|---|
i | 1 | 1 | 10000 | 10000 |
j | 10000 | 10000 | 10000*100 | 10000*100 |
k | 10000*100 | 10000*100 | 1000010010 | 1000010010 |
優(yōu)化后:
變量 | 實例化(次數(shù)) | 初始化(次數(shù)) | 比較(次數(shù)) | 自增(次數(shù)) |
---|---|---|---|---|
i | 1 | 1 | 10 | 10 |
j | 10 | 10 | 10*100 | 10*100 |
k | 10*100 | 10*100 | 1010010000 | 1010010000 |
嵌套循環(huán)應(yīng)該遵循“外小內(nèi)大”的原則
2.循環(huán)變量的實例化應(yīng)放在循環(huán)外在1.中優(yōu)化后的代碼基礎(chǔ)上,進行二次優(yōu)化:
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("提取出循環(huán)內(nèi)變量后耗時:"+(endTime - stratTime));
結(jié)果如下:
外小內(nèi)大耗時:761666633 提取出循環(huán)內(nèi)變量后耗時:748479323
優(yōu)化并不明顯,但是當(dāng)循環(huán)越大時,耗時會差距更大
## 優(yōu)化原理
優(yōu)化后:
變量 | 實例化(次數(shù)) | 初始化(次數(shù)) | 比較(次數(shù)) | 自增(次數(shù)) |
---|---|---|---|---|
i | 1 | 1 | 10 | 10 |
j | 1 | 10 | 10*100 | 10*100 |
k | 1 | 10*100 | 1010010000 | 1010010000 |
循環(huán)變量的實例化應(yīng)該盡量放在循環(huán)外進行
3.提取與循環(huán)無關(guān)的表達式stratTime = System.nanoTime(); for (int i = 0; i < 10000000; i++) { i=i*a*b; } endTime = System.nanoTime(); System.out.println("未提取耗時:"+(endTime - stratTime));
優(yōu)化后:
stratTime = System.nanoTime(); c = a*b; for (int i = 0; i < 10000000; i++) { i=i*c; } endTime = System.nanoTime(); System.out.println("已提取耗時:"+(endTime - stratTime));結(jié)論:
代碼中a+b與我們的循環(huán)無關(guān),所以應(yīng)該把它放到外面,避免重復(fù)計算。
4.消除循環(huán)終止判斷時的方法調(diào)用stratTime = System.nanoTime(); for (int i = 0; i < list.size(); i++) { } endTime = System.nanoTime(); System.out.println("未優(yōu)化list耗時:"+(endTime - stratTime));
優(yōu)化后:
stratTime = System.nanoTime(); int size = list.size(); for (int i = 0; i < size; i++) { } endTime = System.nanoTime(); System.out.println("優(yōu)化list耗時:"+(endTime - stratTime));結(jié)論
list.size()每次循環(huán)都會被執(zhí)行一次,這無疑會影響程序的性能,所以應(yīng)該將其放到循環(huán)外面,用一個變量來代替。
5.異常捕獲stratTime = System.nanoTime(); for (int i = 0; i < 10000000; i++) { try { } catch (Exception e) { } } endTime = System.nanoTime(); System.out.println("在內(nèi)部捕獲異常耗時:"+(endTime - stratTime));
優(yōu)化后:
stratTime = System.nanoTime(); try { for (int i = 0; i < 10000000; i++) { } } catch (Exception e) { } endTime = System.nanoTime(); System.out.println("在外部捕獲異常耗時:"+(endTime - stratTime));結(jié)論
捕獲異常是很耗資源的,所以不要講try catch放到循環(huán)內(nèi)部。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/68134.html
摘要:常見標(biāo)高線程上下文切換頻繁線程太多鎖競爭激烈標(biāo)高如果的占用很高,排查涉及到的程序,比如把改造成。抖動問題原因字節(jié)碼轉(zhuǎn)為機器碼需要占用時間片,大量的在執(zhí)行字節(jié)碼時,導(dǎo)致長期處于高位現(xiàn)象,占用率最高解決辦法保證編譯線程的占比。 一、并發(fā) Unable to create new native thread …… 問題1:Java中創(chuàng)建一個線程消耗多少內(nèi)存? 每個線程有獨自的棧內(nèi)存,共享堆內(nèi)...
摘要:作用域鏈查找作用域鏈的查找是逐層向上查找。而全局變量和閉包則會與之相反,繼續(xù)保存,所以使用用后需手動標(biāo)記清除,以免造成內(nèi)存泄漏。獲取元素的屬性獲取元素的屬性等參考文檔高級程序設(shè)計作者以樂之名本文原創(chuàng),有不當(dāng)?shù)牡胤綒g迎指出。 showImg(https://segmentfault.com/img/bVburXV?w=500&h=399); 作用域鏈查找 作用域鏈的查找是逐層向上查找。查...
摘要:四如果需要遍歷數(shù)組,應(yīng)該先緩存數(shù)組長度,將數(shù)組長度放入局部變量中,避免多次查詢數(shù)組長度。五盡量選用局部變量而不是全局變量。所以如果這樣的表達式重復(fù)出現(xiàn),只要可能,應(yīng)該盡量少出現(xiàn)這樣的表達式,可以利用局部變量,把它放入一個臨時的地方進行查詢。 通過網(wǎng)上查找資料了解關(guān)于性能優(yōu)化方面的內(nèi)容,現(xiàn)簡單整理,僅供大家在優(yōu)化的過程中參考使用,如有什么問題請及時提出,再做出相應(yīng)的補充修改。 一、 讓...
摘要:實戰(zhàn)讀書筆記第一章從方法傳遞到接著上次的,繼續(xù)來了解一下,如果繼續(xù)簡化代碼。去掉并且生成的數(shù)字是萬,所消耗的時間循序流并行流至于為什么有時候并行流效率比循序流還低,這個以后的文章會解釋。 《Java8實戰(zhàn)》-讀書筆記第一章(02) 從方法傳遞到Lambda 接著上次的Predicate,繼續(xù)來了解一下,如果繼續(xù)簡化代碼。 把方法作為值來傳遞雖然很有用,但是要是有很多類似與isHeavy...
閱讀 2773·2021-11-18 10:02
閱讀 2358·2021-09-30 09:47
閱讀 1932·2021-09-27 14:01
閱讀 3218·2021-08-16 11:00
閱讀 3232·2019-08-30 11:06
閱讀 2462·2019-08-29 17:29
閱讀 1606·2019-08-29 13:19
閱讀 504·2019-08-26 13:54