結(jié)合自己的工作和平時(shí)學(xué)習(xí)的體驗(yàn)重新談一下為什么要進(jìn)行代碼優(yōu)化。在修改之前,作者的說(shuō)法是這樣的:
就像鯨魚吃蝦米一樣,也許吃一個(gè)兩個(gè)蝦米對(duì)于鯨魚來(lái)說(shuō)作用不大,但是吃的蝦米多了,鯨魚自然飽了。
代碼優(yōu)化一樣,也許一個(gè)兩個(gè)的優(yōu)化,對(duì)于提升代碼的運(yùn)行效率意義不大,但是只要處處都能注意代碼優(yōu)化,總體來(lái)說(shuō)對(duì)于提升代碼的運(yùn)行效率就很有用了。
這個(gè)觀點(diǎn),在現(xiàn)在看來(lái),是要進(jìn)行代碼優(yōu)化的一個(gè)原因,但不全對(duì)。在機(jī)械工藝發(fā)展的今天,服務(wù)器動(dòng)輒8核、16核,64位CPU,代碼執(zhí)行效率非常高,StringBuilder替換StringBuffer、ArrayList替換Vector,對(duì)于代碼運(yùn)行效率的提升是微乎其微的,即使是項(xiàng)目中的每個(gè)點(diǎn)都注意到了,代碼運(yùn)行也看不出什么明顯的變化。
我認(rèn)為,代碼優(yōu)化的重要的作用應(yīng)該是:避免未知的錯(cuò)誤。在代碼上線運(yùn)行的過(guò)程中,往往會(huì)出現(xiàn)很多我們意想不到的錯(cuò)誤,因?yàn)榫€上環(huán)境和開發(fā)環(huán)境是非常不同的,錯(cuò)誤定位到后往往是一個(gè)非常小的原因。然而為了解決這個(gè)錯(cuò)誤,我們需要先自驗(yàn)證、再打包出待替換的class文件、暫停業(yè)務(wù)并重啟,對(duì)于一個(gè)成熟的項(xiàng)目而言,后一條其實(shí)影響是非常大的,這意味著這段時(shí)間用戶無(wú)法訪問(wèn)應(yīng)用。因此,在寫代碼的時(shí)候,從源頭開始注意各種細(xì)節(jié),權(quán)衡并使用優(yōu)的選擇,將會(huì)很大程度上避免出現(xiàn)未知的錯(cuò)誤,從長(zhǎng)遠(yuǎn)看也極大的降低了工作量。
一、java代碼優(yōu)化的目標(biāo)是:
1、減小代碼的體積
2、提高代碼運(yùn)行的效率
本文的內(nèi)容有些來(lái)自網(wǎng)絡(luò),有些來(lái)自平時(shí)工作和學(xué)習(xí),當(dāng)然這不重要,重要的是這些代碼優(yōu)化的細(xì)節(jié)是否真真正正地有用。那本文會(huì)保持長(zhǎng)期更新,只要有遇到值得分享的代碼優(yōu)化細(xì)節(jié),就會(huì)不定時(shí)地更新此文。
二、java代碼優(yōu)化細(xì)節(jié):
1、盡量指定類、方法的final修飾符
帶有final修飾符的類是不可派生的。在Java核心API中,有許多應(yīng)用final的例子,例如java.lang.String,整個(gè)類都是final的。為類指定final修飾符可以讓類不可以被繼承,為方法指定final修飾符可以讓方法不可以被重寫。如果指定了一個(gè)類為final,則該類所有的方法都是final的。Java編譯器會(huì)尋找機(jī)會(huì)內(nèi)聯(lián)所有的final方法,內(nèi)聯(lián)對(duì)于提升Java運(yùn)行效率作用重大,具體參見Java運(yùn)行期優(yōu)化。此舉能夠使性能平均提高50%。
2、盡量重用對(duì)象
特別是String對(duì)象的使用,出現(xiàn)字符串連接時(shí)應(yīng)該使用StringBuilder/StringBuffer代替。由于Java虛擬機(jī)不僅要花時(shí)間生成對(duì)象,以后可能還需要花時(shí)間對(duì)這些對(duì)象進(jìn)行垃圾回收和處理,因此,生成過(guò)多的對(duì)象將會(huì)給程序的性能帶來(lái)很大的影響。
3、盡可能使用局部變量
調(diào)用方法時(shí)傳遞的參數(shù)以及在調(diào)用中創(chuàng)建的臨時(shí)變量都保存在棧中,速度較快,其他變量,如靜態(tài)變量、實(shí)例變量等,都在堆中創(chuàng)建,速度較慢。另外,棧中創(chuàng)建的變量,隨著方法的運(yùn)行結(jié)束,這些內(nèi)容就沒(méi)了,不需要額外的垃圾回收。
4、及時(shí)關(guān)閉流
Java編程過(guò)程中,進(jìn)行數(shù)據(jù)庫(kù)連接、I/O流操作時(shí)務(wù)必小心,在使用完畢后,及時(shí)關(guān)閉以釋放資源。因?yàn)閷?duì)這些大對(duì)象的操作會(huì)造成系統(tǒng)大的開銷,稍有不慎,將會(huì)導(dǎo)致嚴(yán)重的后果。
南京北大青鳥,主要課程:
南京ui-web前端-java培訓(xùn)。課程包括:南京web前端培訓(xùn)、南京java培訓(xùn)、南京ui培訓(xùn)、南京android培訓(xùn)、ios、微信營(yíng)銷等課程。