日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
11個(gè)值得掌握的Java代碼性能優(yōu)化技巧

1.避免方法過(guò)長(zhǎng)

一方面,從維護(hù)角度來(lái)說(shuō),適當(dāng)長(zhǎng)度的方法易讀性更強(qiáng),更容易理解;另一方面,在類的加載和方法調(diào)用的過(guò)程中,方法會(huì)被加載到內(nèi)存中。如果一個(gè)方法太大,處理起來(lái)就需要消耗額外的內(nèi)存和CPU周期。我們應(yīng)該學(xué)會(huì)在恰當(dāng)?shù)倪壿孅c(diǎn)上將一個(gè)長(zhǎng)方法拆開(kāi)。

固鎮(zhèn)網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,固鎮(zhèn)網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為固鎮(zhèn)千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營(yíng)銷網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的固鎮(zhèn)做網(wǎng)站的公司定做!

2.避免多個(gè)if-else語(yǔ)句

對(duì)于這個(gè)優(yōu)化點(diǎn),大家應(yīng)該很熟悉了。但是實(shí)際在寫代碼的時(shí)候,還是if-else一擼到底。

這樣做的話,其實(shí)也會(huì)影響性能。因?yàn)镴VM必須對(duì)條件進(jìn)行比較。如果在for、while等循環(huán)語(yǔ)句中使用同樣的條件,情況會(huì)變得更糟糕。

如果我們的業(yè)務(wù)邏輯中有很多的條件,我們可以嘗試著將這些條件分組并且返回一個(gè)布爾值,然后再將其用于if語(yǔ)句。

另外,如果可能的話,我們可以考慮使用switch語(yǔ)句來(lái)代替多個(gè)if-else。switch語(yǔ)句比if-else有性能優(yōu)勢(shì)。 下面我們看一個(gè)例子:

if (condition1) {

if (condition2) {

if (condition3 || condition4) { execute ..}

else { execute..}

對(duì)比上面這段代碼,合適的做法應(yīng)該如下:

boolean result = (condition1 && condition2) && (condition3  || condition4)

3.避免使用iterator

用Java5的foreach風(fēng)格來(lái)寫循環(huán)確實(shí)很方便很簡(jiǎn)潔,看起來(lái)就很酷!

但是有的時(shí)候??崾且冻鲂阅艿拇鷥r(jià)的。

例如:

for (String str: strs) {
. . .
}

每次運(yùn)行代碼,如果strs是Iterable的,你將會(huì)創(chuàng)建一個(gè)新的Iterator對(duì)象。這樣做會(huì)導(dǎo)致更多內(nèi)存的消耗。

如果你對(duì)性能有著極致的追求,那么還是建議你使用原始的寫法:

int size = strs.size();
for (int i = 0; i < size; i++) {
String value = strs.get(i);
. . .
}

4. 避免在集合中獲取size

在對(duì)任何集合進(jìn)行迭代時(shí),要事先得到集合的大小,而不是在迭代過(guò)程中得到它——這樣避免多次調(diào)用size()方法。

下面請(qǐng)看這個(gè)例子:

List eleList = getData();
for (int i = 0; i < eleList.size(); i++) { execute code ..}

對(duì)比上面這段代碼,合適的做法應(yīng)該如下:

List objList = getData();
int size = objList.size();
for (int i = 0; i < size; i++) { execute code ..}

5.避免使用+號(hào)拼接字符串

從JDK5開(kāi)始,Java編譯器就做了優(yōu)化,使用+號(hào)拼接字符串,編譯器編譯后實(shí)際就自動(dòng)優(yōu)化為使用StringBuilder。

而且String是final類,用String創(chuàng)建的對(duì)象無(wú)法重復(fù)使用。因此,如果我們需要連續(xù)拼接,使用+號(hào)拼接字符串將導(dǎo)致創(chuàng)建多個(gè)String對(duì)象,從而會(huì)占用更多的堆內(nèi)存。

一般來(lái)說(shuō),當(dāng)字符串不多的時(shí)候,+號(hào)與StringBuilder的拼接效率其實(shí)相差無(wú)幾;但是如果涉及到單線程循環(huán)拼接的時(shí)候,我們最好還是使用StringBuilder以保證性能上的優(yōu)化。

下面請(qǐng)看一個(gè)例子:

String str = "sample";
for (int i = 0; i < count; i++) {
str = str + "-" + i;
}

更合適的做法如下:

StringBuilder stringBuilder = new StringBuilder("sample");
for (int i = 0; i < count; i++) {
stringBuilder.append("-");
stringBuilder.append(i);
}

6.盡可能使用基本類型

因?yàn)榛绢愋痛鎯?chǔ)在棧內(nèi)存中,而對(duì)象存儲(chǔ)在堆內(nèi)存中。如果可以的話,我們應(yīng)該盡可能使用基本類型而非對(duì)象,因?yàn)闂?nèi)存的訪問(wèn)速度比堆內(nèi)存快。

因此在某些情況下,定義一個(gè)變量或者數(shù)組,我們可以使用int而非Integer,double而非Double。

7.避免使用BigDecimal類

BigDecimal類提供了精確的小數(shù)值,過(guò)度使用這個(gè)對(duì)象會(huì)對(duì)性能造成影響,特別是當(dāng)這個(gè)對(duì)象被用來(lái)在循環(huán)中計(jì)算某些數(shù)值時(shí)。

BigDecimal在進(jìn)行計(jì)算時(shí)要比long或double占用更多的內(nèi)存。如果精度不受限制,或者我們確認(rèn)計(jì)算值的范圍不會(huì)超過(guò)long或double,我們可以避免使用BigDecimal,而使用long或double,并進(jìn)行適當(dāng)?shù)霓D(zhuǎn)換。

8.避免經(jīng)常創(chuàng)建“代價(jià)昂貴”的對(duì)象

有一些類在應(yīng)用程序中承載著數(shù)據(jù),這些對(duì)象的創(chuàng)建開(kāi)銷很大,我們應(yīng)該避免多次創(chuàng)建。

比如說(shuō),數(shù)據(jù)庫(kù)連接對(duì)象,系統(tǒng)配置對(duì)象,或者是用戶登錄的會(huì)話對(duì)象。這些對(duì)象在創(chuàng)建的時(shí)候占用了大量資源,我們應(yīng)該選擇重用這些對(duì)象,而不是再次創(chuàng)建。

對(duì)于這些"代價(jià)昂貴"的對(duì)象,我們盡可能使用單例模式來(lái)創(chuàng)建單一實(shí)例,并在需要的地方重用它。

9.使用PreparedStatement而不是Statement

現(xiàn)在應(yīng)該比較少用JDBC API進(jìn)行SQL查詢了,但是我覺(jué)得還是有必要了解一下。

對(duì)于參數(shù)化查詢,PreparedStatement比Statement更有優(yōu)勢(shì),因?yàn)镻reparedStatement對(duì)象被編譯一次并執(zhí)行多次。Statement對(duì)象在每次被調(diào)用時(shí)都會(huì)被編譯和執(zhí)行。

此外,PreparedStatement對(duì)象是安全的,可以避免SQL注入攻擊。

10.避免使用不必要的日志語(yǔ)句和不正確的日志級(jí)別

這個(gè)建議應(yīng)該是很普遍的,但是很多代碼忽略了這一點(diǎn)。我們?cè)趧?chuàng)建調(diào)試信息的時(shí)候,應(yīng)該先檢查一下當(dāng)前的日志級(jí)別。

否則你可能會(huì)無(wú)意之間創(chuàng)建一條無(wú)用的日志信息。 請(qǐng)看例子:

log.debug("User [" + userName + "] called method X with [" + i + "]");
log.debug(String.format("User [%s] called method X with [%d]", userName, i));

11.選擇SQL查詢中的必要字段

有時(shí),我們需要寫SQL來(lái)獲取數(shù)據(jù)。此時(shí)我們應(yīng)該避免選擇所有數(shù)據(jù)庫(kù)列,只選擇我們需要的數(shù)據(jù)庫(kù)列。

選擇太多的列會(huì)導(dǎo)致數(shù)據(jù)庫(kù)查詢執(zhí)行的延遲,也會(huì)增加網(wǎng)絡(luò)流量。

請(qǐng)看示例:

select * from books where book_id = 6;

對(duì)此,我建議這么寫:

select book_title, book_desc, book_price from books where book_id = 6;

結(jié)語(yǔ)

很多人認(rèn)為性能優(yōu)化是一個(gè)復(fù)雜的話題,需要大量的經(jīng)驗(yàn)和知識(shí),這在一定程度上是對(duì)的。

我們開(kāi)發(fā)一個(gè)應(yīng)用程序并且期望獲得盡可能好的性能并不是一件容易的事情。但是,即使你不是性能調(diào)優(yōu)專家,也可以采取一些簡(jiǎn)單的方法來(lái)提高性能。


新聞標(biāo)題:11個(gè)值得掌握的Java代碼性能優(yōu)化技巧
轉(zhuǎn)載注明:http://m.5511xx.com/article/ccsjcip.html