開發(fā)者在編程中除了要對有編程規(guī)范,還要注意性能哦,今天就工作中遇到的一些問題進行了一個簡單總結(jié),希望攻城獅來批評指正。
作為一個QA,從質(zhì)量管理方面得到的認識:
a.一行代碼能解決的問題 盡量不要使用多行,代碼行數(shù)越多 維護成本越高,出現(xiàn)缺陷的概率也就越多
b.一行代碼編寫可能只需要30s,發(fā)現(xiàn)并優(yōu)化一行代碼產(chǎn)生的性能問題需要72h,甚至更多
不說了,下面就簡單說下實際編程過程中性能相關的問題吧:
1、循環(huán)邏輯中減少創(chuàng)建對象次數(shù)
例如:for(int i = 0;i < list.size; i ++) {
…
}
應替換為:
for(int i = 0,int len = list.size();i < len; i ++) {
…
}
2、循環(huán)結(jié)構(gòu)是否存在多次訪問網(wǎng)絡、數(shù)據(jù)庫等 操作
原則:能夠一次性查詢完成的 盡量避免多次查詢
優(yōu)化前:
優(yōu)化后:
3、對象容錯性差
原則:參數(shù)傳遞過程中不要直接轉(zhuǎn)換使用JSONObject這種對象,如果取值不存在該方法會報異常導致程序中止,盡量轉(zhuǎn)為JavaBean或Map;否則應先判斷取的值是否存在。最好以JavaBean封裝接收參數(shù),并對參數(shù)進行初步較驗,不能將數(shù)據(jù)完整性交給前端處理。
如果使用JSONObject對象,應先進行存在判斷if(json.contains(“xxx”))
4、對需要緩存的信息進行合理設計
原則:登錄功能要分析哪些是跟用戶密切相關的,如session信息,哪些是跟業(yè)務系統(tǒng)屬性相關的,如 系統(tǒng)配置資源信息。后者則應當進行緩存處理,避免每次登錄都構(gòu)建獲取信息。
5、業(yè)務邏輯的執(zhí)行順序問題
原則:在進行邏輯判斷的過程中,盡量使復雜操作延遲執(zhí)行,不要提前執(zhí)行;如登錄操作,只有登錄成功后才做相關資源加載、查詢操作;
如示例: 靜態(tài)資源應盡量后置,建議大家在業(yè)務邏輯梳理時先否定再肯定,也就是先列不滿足業(yè)務的條件。
優(yōu)化前:
優(yōu)化后:
6、? Try…catch 相對消耗性能比較嚴重,盡量減少使用頻率,使用中盡量擴大作用范圍,禁止出現(xiàn)在循環(huán)等操作中
7、? 創(chuàng)建類似數(shù)組等可以設定大小的對象,應盡可能指定大小,最大限度減少內(nèi)存空間的浪費
8、? HashMap的讀取遍歷使用entry,而不是先取key集合,再取值
9、? 在方法中創(chuàng)建的對象最好在使用完畢后將引用指向null,利于GC垃圾回收
10、? 數(shù)組復制使用system.arraycopy(),減少使用創(chuàng)建新數(shù)組賦值的方法
11、? 方法大小不要超過80行,方法棧太深容易導致內(nèi)存溢出;盡量不要出現(xiàn)功能太少的類,類的維護也需要性能開銷。
12、? 創(chuàng)建復雜對象應使用clone方法,減少構(gòu)造方法調(diào)用的開銷
13、 ? 待續(xù)...