菜鸟要做架构师(二)——java性能优化之for循环
完成同樣的功能,用不同的代碼來(lái)實(shí)現(xiàn),性能上可能會(huì)有比較大的差別,所以對(duì)于一些性能敏感的模塊來(lái)說(shuō),對(duì)代碼進(jìn)行一定的優(yōu)化還是很有必要的。今天就來(lái)說(shuō)一下java代碼優(yōu)化的事情,今天主要聊一下對(duì)于for(while等同理)循環(huán)的優(yōu)化。
作為三大結(jié)構(gòu)之一的循環(huán),在我們編寫代碼的時(shí)候會(huì)經(jīng)常用到。循環(huán)結(jié)構(gòu)讓我們操作數(shù)組、集合和其他一些有規(guī)律的事物變得更加的方便,但是如果我們?cè)趯?shí)際開發(fā)當(dāng)中運(yùn)用不合理,可能會(huì)給程序的性能帶來(lái)很大的影響。所以我們還是需要掌握一些技巧來(lái)優(yōu)化我們的代碼的。
嵌套循環(huán)
stratTime = System.nanoTime();for (int i = 0; i < 10000000; i++) {for (int j = 0; j < 10; j++) {}}endTime = System.nanoTime();System.out.println("外大內(nèi)小耗時(shí):"+ (endTime - stratTime));?
應(yīng)改為:
stratTime = System.nanoTime();for (int i = 0; i <10 ; i++) {for (int j = 0; j < 10000000; j++) {}}endTime = System.nanoTime();System.out.println("外小內(nèi)大耗時(shí):"+(endTime - stratTime));
兩者耗時(shí)對(duì)比:
由以上對(duì)比可知,優(yōu)化后性能提升了一倍,嵌套循環(huán)應(yīng)該遵循“外小內(nèi)大”的原則,這就好比你復(fù)制很多個(gè)小文件和復(fù)制幾個(gè)大文件的區(qū)別。
提取與循環(huán)無(wú)關(guān)的表達(dá)式
fstratTime = System.nanoTime();for (int i = 0; i < 10000000; i++) {i=i*a*b;}endTime = System.nanoTime();System.out.println("未提取耗時(shí):"+(endTime - stratTime));
應(yīng)改為:
?
兩者耗時(shí)對(duì)比:
未提取耗時(shí):45973050 已提取耗時(shí):1955代碼中a+b與我們的循環(huán)無(wú)關(guān),所以應(yīng)該把它放到外面,避免重復(fù)計(jì)算,可以看出,優(yōu)化后性能提升了好幾個(gè)數(shù)量級(jí),這些是不容忽視的。
消除循環(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īng)改為:
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));
兩者耗時(shí)對(duì)比:
list.size()每次循環(huán)都會(huì)被執(zhí)行一次,這無(wú)疑會(huì)影響程序的性能,所以應(yīng)該將其放到循環(huán)外面,用一個(gè)變量來(lái)代替,優(yōu)化前后的對(duì)比也很明顯。
異常捕獲
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īng)改為:
?
stratTime = System.nanoTime();try {for (int i = 0; i < 10000000; i++) {}} catch (Exception e) {}endTime = System.nanoTime();System.out.println("在外部捕獲異常耗時(shí):"+(endTime - stratTime));?兩者耗時(shí)對(duì)比:
在內(nèi)部捕獲異常耗時(shí):12150142 在外部捕獲異常耗時(shí):1955
大家都知道,捕獲異常是很耗資源的,所以不要講try?catch放到循環(huán)內(nèi)部,優(yōu)化后同樣有好幾個(gè)數(shù)量級(jí)的提升。
性能優(yōu)化的內(nèi)容有很多,代碼優(yōu)化只是其中一小部分,我們?cè)谌粘i_發(fā)中應(yīng)養(yǎng)成良好的編碼習(xí)慣。接下來(lái)會(huì)跟大家探討更多關(guān)于性能優(yōu)化的內(nèi)容,希望大家積極交流指導(dǎo)。
from:?http://www.cnblogs.com/liushuijinger/p/4126928.html
總結(jié)
以上是生活随笔為你收集整理的菜鸟要做架构师(二)——java性能优化之for循环的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 菜鸟要做架构师(一)——如何快速开发中小
- 下一篇: 有史以来最简单的三层实例(C#)