開發(fā)者在編程中除了要對有編程規(guī)范,還要注意性能哦,今天就工作中遇到的一些問題進行了一個簡單總結(jié),希望攻城獅來批評指正。
作為一個QA,從質(zhì)量管理方面得到的認(rèn)識:
a.一行代碼能解決的問題 盡量不要使用多行,代碼行數(shù)越多 維護成本越高,出現(xiàn)缺陷的概率也就越多
b.一行代碼編寫可能只需要30s,發(fā)現(xiàn)并優(yōu)化一行代碼產(chǎn)生的性能問題需要72h,甚至更多
不說了,下面就簡單說下實際編程過程中性能相關(guān)的問題吧:
1、循環(huán)邏輯中減少創(chuàng)建對象次數(shù)
例如:for(int i = 0;i < list.size; i ++) {
…
}
應(yīng)替換為:
for(int i = 0,int len = list.size();i < len; i ++) {
…
}
2、循環(huán)結(jié)構(gòu)是否存在多次訪問網(wǎng)絡(luò)、數(shù)據(jù)庫等 操作
原則:能夠一次性查詢完成的 盡量避免多次查詢
優(yōu)化前:

優(yōu)化后:

3、對象容錯性差

原則:參數(shù)傳遞過程中不要直接轉(zhuǎn)換使用JSONObject這種對象,如果取值不存在該方法會報異常導(dǎo)致程序中止,盡量轉(zhuǎn)為JavaBean或Map;否則應(yīng)先判斷取的值是否存在。最好以JavaBean封裝接收參數(shù),并對參數(shù)進行初步較驗,不能將數(shù)據(jù)完整性交給前端處理。
如果使用JSONObject對象,應(yīng)先進行存在判斷if(json.contains(“xxx”))
4、對需要緩存的信息進行合理設(shè)計
原則:登錄功能要分析哪些是跟用戶密切相關(guān)的,如session信息,哪些是跟業(yè)務(wù)系統(tǒng)屬性相關(guān)的,如 系統(tǒng)配置資源信息。后者則應(yīng)當(dāng)進行緩存處理,避免每次登錄都構(gòu)建獲取信息。

5、業(yè)務(wù)邏輯的執(zhí)行順序問題
原則:在進行邏輯判斷的過程中,盡量使復(fù)雜操作延遲執(zhí)行,不要提前執(zhí)行;如登錄操作,只有登錄成功后才做相關(guān)資源加載、查詢操作;
如示例: 靜態(tài)資源應(yīng)盡量后置,建議大家在業(yè)務(wù)邏輯梳理時先否定再肯定,也就是先列不滿足業(yè)務(wù)的條件。
優(yōu)化前:

優(yōu)化后:

6、? Try…catch 相對消耗性能比較嚴(yán)重,盡量減少使用頻率,使用中盡量擴大作用范圍,禁止出現(xiàn)在循環(huán)等操作中
7、? 創(chuàng)建類似數(shù)組等可以設(shè)定大小的對象,應(yīng)盡可能指定大小,最大限度減少內(nèi)存空間的浪費
8、? HashMap的讀取遍歷使用entry,而不是先取key集合,再取值
9、? 在方法中創(chuàng)建的對象最好在使用完畢后將引用指向null,利于GC垃圾回收
10、? 數(shù)組復(fù)制使用system.arraycopy(),減少使用創(chuàng)建新數(shù)組賦值的方法
11、? 方法大小不要超過80行,方法棧太深容易導(dǎo)致內(nèi)存溢出;盡量不要出現(xiàn)功能太少的類,類的維護也需要性能開銷。
12、? 創(chuàng)建復(fù)雜對象應(yīng)使用clone方法,減少構(gòu)造方法調(diào)用的開銷
13、 ? 待續(xù)...