摘要:開(kāi)發(fā)者在編程中除了要有編程規(guī)范,還要注意性能哦,今天就工作中遇到的一些問(wèn)題進(jìn)行了一個(gè)簡(jiǎn)單總結(jié),希望攻城獅來(lái)批評(píng)指正。
開(kāi)發(fā)者在編程中除了要有編程規(guī)范,還要注意性能,在 Java 編程中有什么提高性能的好辦法呢?
本文轉(zhuǎn)自國(guó)內(nèi) ITOM 行業(yè)領(lǐng)軍企業(yè) OneAPM Cloud Insight(一款能夠優(yōu)雅監(jiān)控多種操作系統(tǒng)、數(shù)據(jù)庫(kù)、中間件、云主機(jī)的解決方案)美女工程師陳永梅簡(jiǎn)書(shū)。
開(kāi)發(fā)者在編程中除了要有編程規(guī)范,還要注意性能哦,今天就工作中遇到的一些問(wèn)題進(jìn)行了一個(gè)簡(jiǎn)單總結(jié),希望攻城獅來(lái)批評(píng)指正。
作為一個(gè)QA,從質(zhì)量管理方面得到的認(rèn)識(shí):
一行代碼能解決的問(wèn)題 盡量不要使用多行,代碼行數(shù)越多 維護(hù)成本越高,出現(xiàn)缺陷的概率也就越多;
一行代碼編寫(xiě)可能只需要 30s,發(fā)現(xiàn)并優(yōu)化一行代碼產(chǎn)生的性能問(wèn)題需要 72h,甚至更多。
不說(shuō)了,下面就簡(jiǎn)單說(shuō)下實(shí)際編程過(guò)程中性能相關(guān)的問(wèn)題吧:
1、循環(huán)邏輯中減少創(chuàng)建對(duì)象次數(shù)
例如:
for(int i = 0;i < list.size; i ++) { … }
應(yīng)替換為:
for(int i = 0,int len = list.size();i < len; i ++) { … }
2、關(guān)注循環(huán)結(jié)構(gòu)是否存在多次訪問(wèn)網(wǎng)絡(luò)、數(shù)據(jù)庫(kù)等操作
原則:能夠一次性查詢(xún)完成的 盡量避免多次查詢(xún)。
優(yōu)化前:
優(yōu)化后:
3、對(duì)象容錯(cuò)性差
原則:參數(shù)傳遞過(guò)程中不要直接轉(zhuǎn)換使用 JSONObject 這種對(duì)象,如果取值不存在該方法會(huì)報(bào)異常導(dǎo)致程序中止,盡量轉(zhuǎn)為 JavaBean 或 Map;否則應(yīng)先判斷取的值是否存在。最好以 JavaBean 封裝接收參數(shù),并對(duì)參數(shù)進(jìn)行初步較驗(yàn),不能將數(shù)據(jù)完整性交給前端處理。
如果使用 JSONObject 對(duì)象,應(yīng)先進(jìn)行存在判斷if(json.contains(“xxx”))
4、對(duì)需要緩存的信息進(jìn)行合理設(shè)計(jì)
原則:登錄功能要分析哪些是跟用戶(hù)密切相關(guān)的,如 session 信息,哪些是跟業(yè)務(wù)系統(tǒng)屬性相關(guān)的,如系統(tǒng)配置資源信息。后者則應(yīng)當(dāng)進(jìn)行緩存處理,避免每次登錄都構(gòu)建獲取信息。
5、業(yè)務(wù)邏輯的執(zhí)行順序問(wèn)題
原則:在進(jìn)行邏輯判斷的過(guò)程中,盡量使復(fù)雜操作延遲執(zhí)行,不要提前執(zhí)行;如登錄操作,只有登錄成功后才做相關(guān)資源加載、查詢(xún)操作;
如示例:靜態(tài)資源應(yīng)盡量后置,建議大家在業(yè)務(wù)邏輯梳理時(shí)先否定再肯定,也就是先列不滿(mǎn)足業(yè)務(wù)的條件。
優(yōu)化前:
優(yōu)化后:
6、Try…catch 相對(duì)消耗性能比較嚴(yán)重,盡量減少使用頻率,使用中盡量擴(kuò)大作用范圍,禁止出現(xiàn)在循環(huán)等操作中。
7、創(chuàng)建類(lèi)似數(shù)組等可以設(shè)定大小的對(duì)象,應(yīng)盡可能指定大小,最大限度減少內(nèi)存空間的浪費(fèi)。
8、HashMap 的讀取遍歷使用 entry,而不是先取 key 集合,再取值。
9、在方法中創(chuàng)建的對(duì)象最好在使用完畢后將引用指向 null,利于 GC 垃圾回收。
10、數(shù)組復(fù)制使用 system.arraycopy(),減少使用創(chuàng)建新數(shù)組賦值的方法。
11、方法大小不要超過(guò)80行,方法棧太深容易導(dǎo)致內(nèi)存溢出;盡量不要出現(xiàn)功能太少的類(lèi),類(lèi)的維護(hù)也需要性能開(kāi)銷(xiāo)。
12、創(chuàng)建復(fù)雜對(duì)象應(yīng)使用clone方法,減少構(gòu)造方法調(diào)用的開(kāi)銷(xiāo)。
13、待續(xù)...
Cloud Insight 集監(jiān)控、管理、計(jì)算、協(xié)作、可視化于一身的數(shù)據(jù)管理平臺(tái),幫助所有 IT 公司,減少在系統(tǒng)監(jiān)控上的人力和時(shí)間成本投入,讓運(yùn)維工作更加高效、簡(jiǎn)單。
本文轉(zhuǎn)自 OneAPM 官方博客
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65553.html
摘要:基礎(chǔ)問(wèn)題的的性能及原理之區(qū)別詳解備忘筆記深入理解流水線(xiàn)抽象關(guān)鍵字修飾符知識(shí)點(diǎn)總結(jié)必看篇中的關(guān)鍵字解析回調(diào)機(jī)制解讀抽象類(lèi)與三大特征時(shí)間和時(shí)間戳的相互轉(zhuǎn)換為什么要使用內(nèi)部類(lèi)對(duì)象鎖和類(lèi)鎖的區(qū)別,,優(yōu)缺點(diǎn)及比較提高篇八詳解內(nèi)部類(lèi)單例模式和 Java基礎(chǔ)問(wèn)題 String的+的性能及原理 java之yield(),sleep(),wait()區(qū)別詳解-備忘筆記 深入理解Java Stream流水...
摘要:基礎(chǔ)問(wèn)題的的性能及原理之區(qū)別詳解備忘筆記深入理解流水線(xiàn)抽象關(guān)鍵字修飾符知識(shí)點(diǎn)總結(jié)必看篇中的關(guān)鍵字解析回調(diào)機(jī)制解讀抽象類(lèi)與三大特征時(shí)間和時(shí)間戳的相互轉(zhuǎn)換為什么要使用內(nèi)部類(lèi)對(duì)象鎖和類(lèi)鎖的區(qū)別,,優(yōu)缺點(diǎn)及比較提高篇八詳解內(nèi)部類(lèi)單例模式和 Java基礎(chǔ)問(wèn)題 String的+的性能及原理 java之yield(),sleep(),wait()區(qū)別詳解-備忘筆記 深入理解Java Stream流水...
摘要:基礎(chǔ)問(wèn)題的的性能及原理之區(qū)別詳解備忘筆記深入理解流水線(xiàn)抽象關(guān)鍵字修飾符知識(shí)點(diǎn)總結(jié)必看篇中的關(guān)鍵字解析回調(diào)機(jī)制解讀抽象類(lèi)與三大特征時(shí)間和時(shí)間戳的相互轉(zhuǎn)換為什么要使用內(nèi)部類(lèi)對(duì)象鎖和類(lèi)鎖的區(qū)別,,優(yōu)缺點(diǎn)及比較提高篇八詳解內(nèi)部類(lèi)單例模式和 Java基礎(chǔ)問(wèn)題 String的+的性能及原理 java之yield(),sleep(),wait()區(qū)別詳解-備忘筆記 深入理解Java Stream流水...
摘要:常見(jiàn)的八大排序算法,他們之間關(guān)系如下被人忽視的面向?qū)ο蟮牧笤瓌t后端掘金前言作為文集的第一篇,我覺(jué)得有必要介紹一下大概的寫(xiě)作規(guī)劃。 Java多線(xiàn)程干貨系列—(四)volatile關(guān)鍵字| 掘金技術(shù)征文 - 掘金原本地址:Java多線(xiàn)程干貨系列—(四)volatile關(guān)鍵字博客地址:http://tengj.top/ 前言 今天介紹下volatile關(guān)鍵字,volatile這個(gè)關(guān)鍵字可能...
閱讀 1607·2021-11-02 14:48
閱讀 3663·2019-08-30 15:56
閱讀 2777·2019-08-30 15:53
閱讀 3217·2019-08-30 14:09
閱讀 3109·2019-08-30 12:59
閱讀 2864·2019-08-29 18:38
閱讀 2702·2019-08-26 11:41
閱讀 2222·2019-08-23 16:45