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