版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
代碼質(zhì)量用友金融信息技術(shù)有限公司姜冬金2013年3月6日代碼質(zhì)量代碼質(zhì)量代碼規(guī)范編程規(guī)范SQL編寫規(guī)范代碼性能JAVA代碼調(diào)優(yōu)數(shù)據(jù)庫調(diào)優(yōu)代碼規(guī)范代碼規(guī)范—代碼書寫規(guī)范編程規(guī)范必須給程序加注釋。注釋能夠極大提高代碼的質(zhì)量。代碼的書寫必須清晰、易讀。適當(dāng)?shù)膶⒋a分段可以使代碼更加清楚。可以使用‘{’‘}’將函數(shù)分成若干個小的單元;適當(dāng)?shù)募尤肟招锌梢允勾a更加清晰。例如在函數(shù)的定義后面加入兩個空行,在兩個邏輯小代碼單元間加入一個空行;建議遵循三十秒原則。如果另一個程序員無法在三十秒之內(nèi)了解你的函數(shù)做了什么,如何做以及為什么要這樣做,那就說明你的代碼是難于維護的,必須得到提高;在一個函數(shù)內(nèi)代碼的長度不允許超過150行。建議如果一個函數(shù)的代碼長度超過一個屏幕,那么或許這個函數(shù)太長了。一行代碼盡量簡短,并且保證一行代碼只做一件事。那種看似技巧性的冗長代碼只會增加代碼維護的難度。保證不必左右拉動滾動條來閱讀一整行代碼,將會使你的代碼更加可讀,這一點包括注釋;代碼規(guī)范—代碼書寫規(guī)范使用統(tǒng)一的格式化代碼。將‘{’放在所有者的后面,并且在下一行代碼前加入TAB鍵4格縮進;(TAB鍵比用若干個空格更容易控制使用統(tǒng)一的縮進距離)if(XXX){while(XXX){xxxxxx}}變量名、方法名、類名命名要有意義,禁止使用類似于a,b,c這種命名,禁止使用漢語拼音命名。嚴(yán)格遵守異常處理規(guī)范,嚴(yán)禁直接打印異常。接口實現(xiàn)類中的全局變量要慎重使用,因為當(dāng)調(diào)用時是全局共享的,會導(dǎo)致不可預(yù)見的問題發(fā)生。面向接口編程,禁止在方法中使用ArrayList等聲明變量,必須用其接口List,Map等聲明,除非必須使用這些實現(xiàn)類中的方法。
代碼規(guī)范—代碼書寫規(guī)范方法只做一件事,同時在做幾件事的代碼很難理解,一個方法可能包含初始化對象、清除數(shù)據(jù)、解析輸入等,如果我們要對其中某一件事進行修改那必須確保我們把所有代碼讀完后才能放心的修改,降低了程序的可能讀和維護效率。變量的作用域盡可能小,同時避免一個變量多次賦值。減少不必要的臨時變量。
代碼規(guī)范—SQL編寫規(guī)范SQL編寫規(guī)范SQL語句全部使用小寫。引用字符時用單引號。如:updatetestablesetidcol=’abcd’。連接符或運算符or、in、and、=、<=、>=,+,-等前后加上一個空格。嚴(yán)禁使用select*…….形式的語句,必須指出select的具體字段,即selectcol1,col2,…fromtableawhere….嚴(yán)禁使用insertintotablevalues(?,?,?),必須指出具體要賦值的字段,即insertintotablea(col1,col2,…)values(?,?,…)SQL語句包含多表連接時,建議對每個表命名別名,對每個字段的使用都要帶上表別名,即selecta.col1,a.col2,b.col3fromtableaa,tablebbwherea.col4=b.col5代碼規(guī)范—SQL編寫規(guī)范在子查詢中前后必須加上括號,selectcol1,col2fromtableawherecol3in(selectcol4fromtablebwherecol4>0)代碼性能代碼性能—JAVA調(diào)優(yōu)JAVA調(diào)優(yōu)盡量在合適的場合使用單例
使用單例可以減輕加載的負(fù)擔(dān),縮短加載的時間,提高加載的效率,但并不是所有地方都適用于單例,簡單來說,單例
主要適用于以下三個方面:
控制資源的使用,通過線程同步來控制資源的并發(fā)訪問;
控制實例的產(chǎn)生,以達到節(jié)約資源的目的;
控制數(shù)據(jù)共享,在不建立直接關(guān)聯(lián)的條件下,讓多個不相關(guān)的進程或線程之間實現(xiàn)通信。盡量避免隨意使用靜態(tài)變量
要知道,當(dāng)某個對象被定義為static的變量所引用,那么GC通常是不會回收這個對象所占有的內(nèi)存,如publicclassA{staticBb=newB();}此時靜態(tài)變量b的生命周期與A類同步,如果A類不會卸載,那么b對象會常駐內(nèi)存,直到程序終止。代碼性能—JAVA調(diào)優(yōu)盡量避免過多過常的創(chuàng)建Java對象
盡量避免在經(jīng)常調(diào)用的方法,循環(huán)中new對象,由于系統(tǒng)不僅要花費時間來創(chuàng)建對象,而且還要花時間對這些對象進行垃圾回收和處理,在我們可以控制的范圍內(nèi),最大限度的重用對象,最好能用基本的數(shù)據(jù)類型或數(shù)組來替代對象。盡量使用局部變量
調(diào)用方法時傳遞的參數(shù)以及在調(diào)用中創(chuàng)建的臨時變量都保存在棧(Stack)中,速度較快。其他變量,如靜態(tài)變量、實例變量等,都在堆(Heap)中創(chuàng)建,速度較慢。盡量處理好包裝類型和基本類型兩者的使用場所
雖然包裝類型和基本類型在使用過程中是可以相互轉(zhuǎn)換,但它們兩者所產(chǎn)生的內(nèi)存區(qū)域是完全不同的,基本類型數(shù)據(jù)產(chǎn)生和處理都在棧中處理,包裝類型是對象,是在堆中產(chǎn)生實例。
在集合類對象中,有對象方面需要的處理適用包裝類型,其他的處理提倡使用基本類型。代碼性能—JAVA調(diào)優(yōu)慎用synchronized,盡量減小synchronize的方法
都知道,實現(xiàn)同步是要很大的系統(tǒng)開銷作為代價的,甚至可能造成死鎖,所以盡量避免無謂的同步控制。synchronize方法被調(diào)用時,直接會把當(dāng)前對象鎖了,在方法執(zhí)行完之前其他線程無法調(diào)用當(dāng)前對象的其他方法。所以synchronize的方法盡量小,并且應(yīng)盡量使用方法同步代替代碼塊同步。盡量使用StringBuilder和StringBuffer進行字符串連接 String是不可變對象,每進行一次字符串連接都會在String的運行時常量池中創(chuàng)建一個新的String對象,而運行時常量池是位于方法區(qū)內(nèi),不利于GC的回收,造成大量的內(nèi)存被占用。而StringBuilder和StringBuffer則是可變字符串對象,不會產(chǎn)生上述問題,同時StringBuilder是非線程安全的,在單線程編程中,應(yīng)該使用StringBuilder,其性能優(yōu)于StringBuffer。代碼性能—JAVA調(diào)優(yōu)盡量不要使用finalize方法
實際上,將資源清理放在finalize方法中完成是非常不好的選擇,由于GC的工作量很大,尤其是回收新生代內(nèi)存時,大都會引起應(yīng)用程序暫停,所以再選擇使用finalize方法進行資源清理,會導(dǎo)致GC負(fù)擔(dān)更大,程序運行效率更差。容器的使用技巧
單線程編程多使用HashMap、ArrayList,因為HashTable、Vector等使用了同步機制,降低了性能。多線程編程的時候不能使用HashMap,這個可能產(chǎn)生死鎖,應(yīng)該使用ConcurrentHashMap,ConcurrentHashMap在并發(fā)性方面優(yōu)于HashTable。
對于HashMap、HashTable、ArrayList、Vector等底層基于數(shù)組結(jié)構(gòu)的容器,設(shè)置其初始化容量可以極大的避免自動擴增其空間,極大的提高性能。設(shè)置初始化空間的時候,要考慮容積率,一般容器默認(rèn)的容積率為0.75,初始化容量=預(yù)計容量/0.75。代碼性能—JAVA調(diào)優(yōu)
ArrayList是實現(xiàn)了基于動態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),LinkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu)。對于隨機訪問get和set,ArrayList覺得優(yōu)于LinkedList,因為LinkedList要移動指針。對于新增和刪除操作add和remove,LinedList比較占優(yōu)勢,因為ArrayList要移動數(shù)據(jù)。盡量減少對變量的重復(fù)計算
如 for(inti=0;i<list.size();i++)應(yīng)該改為 for(inti=0,len=list.size();i<len;i++)并且在循環(huán)中應(yīng)該避免使用復(fù)雜的表達式,在循環(huán)中,循環(huán)條件會被反復(fù)計算,如果不使用復(fù)雜表達式,而使循環(huán)條件值不變的話,程序?qū)\行的更快。代碼性能—JAVA調(diào)優(yōu)盡量避免不必要的創(chuàng)建如Aa=newA();if(i==1){list.add(a);}應(yīng)該改為if(i==1){Aa=newA();list.add(a);}盡量在finally塊中釋放資源
程序中使用到的資源應(yīng)當(dāng)被釋放,以避免資源泄漏。這最好在finally塊中去做。不管程序執(zhí)行的結(jié)果如何,finally塊總是會執(zhí)行的,以確保資源的正確關(guān)閉。盡量使用移位來代替'a/b'的操作
“/”是一個代價很高的操作,使用移位的操作將會更快和更有效
如 intnum=a/4;intnum=a/8;應(yīng)該改為 intnum=a》2;intnum=a》3;但注意的是使用移位應(yīng)添加注釋,因為移位操作不直觀,比較難理解。代碼性能—JAVA調(diào)優(yōu)盡量使用移位來代替'a*b'的操作同樣的,對于'*'操作,使用移位的操作將會更快和更有效如intnum=a*4;intnum=a*8;應(yīng)該改為intnum=a《2;intnum=a《3;盡量避免使用二維數(shù)組
二維數(shù)據(jù)占用的內(nèi)存空間比一維數(shù)組多得多,大概10倍以上。盡量避免使用split
除非是必須的,否則應(yīng)該避免使用split,split由于支持正則表達式,所以效率比較低,如果是頻繁的幾十,幾百萬的調(diào)用將會耗費大量資源,如果確實需要頻繁的調(diào)用split,可以考慮使用apache的StringUtils.split(string,char),頻繁split的可以緩存結(jié)果。代碼性能—JAVA調(diào)優(yōu)盡量使用System.arraycopy()代替通過來循環(huán)復(fù)制數(shù)組 System.arraycopy()要比通過循環(huán)來復(fù)制數(shù)組快的多。盡量緩存經(jīng)常使用的對象
盡可能將經(jīng)常使用的對象進行緩存,可以使用數(shù)組,或HashMap的容器來進行緩存,但這種方式可能導(dǎo)致系統(tǒng)占用過多的緩存,性能下降,推薦可以使用一些第三方的開源工具,如EhCache,Oscache進行緩存,他們基本都實現(xiàn)了FIFO/FLU等緩存算法。代碼性能—JAVA調(diào)優(yōu)盡量早釋放無用對象的引用
大部分時間,方法局部引用變量所引用的對象會隨著方法結(jié)束而變成垃圾,因此,大部分時候程序無需將局部,引用變量顯式設(shè)為null.
例如: Publicvoidtest(){Objectobj=newObject();……Obj=null;}
上面這個就沒必要了,隨著方法test()的執(zhí)行完成,程序中obj引用變量的作用域就結(jié)束了。但是如果是改成下面: Publicvoidtest(){Objectobj=newObject();……Obj=null;//執(zhí)行耗時,耗內(nèi)存操作;或調(diào)用耗時,耗內(nèi)存的方法……}這時候就有必要將obj賦值為null,可以盡早的釋放對Object對象的引用。代碼性能—JAVA調(diào)優(yōu)慎用異常
當(dāng)創(chuàng)建一個異常時,需要收集一個棧跟蹤(stacktrack),這個棧跟蹤用于描述異常是在何處創(chuàng)建的。構(gòu)建這些棧跟蹤時需要為運行時棧做一份快照,正是這一部分開銷很大。當(dāng)需要創(chuàng)建一個Exception時,JVM不得不說:先別動,我想就您現(xiàn)在的樣子存一份快照,所以暫時停止入棧和出棧操作。棧跟蹤不只包含運行時棧中的一兩個元素,而是包含這個棧中的每一個元素。
如果創(chuàng)建一個Exception,那么就得付出代價。好在捕獲異常開銷不大,因此可以使用try-catch將核心內(nèi)容包起來。從技術(shù)上講,甚至可以隨意地拋出異常,而不用花費很大的代價。招致性能損失的并不是throw操作(盡管在沒有預(yù)先創(chuàng)建異常的情況下就拋出異常是有點不尋常)。真正要花代價的是創(chuàng)建異常。幸運的是,好的編程習(xí)慣已教會我們,不應(yīng)該不管三七二十一就拋出異常。異常是為異常的情況而設(shè)計的,使用時也應(yīng)該牢記這一原則。代碼性能—JAVA調(diào)優(yōu)把try/catch移出循環(huán)
try/catch塊要創(chuàng)建異常對象,Throwable接口的構(gòu)造函數(shù)會檢查堆棧,收集調(diào)用跟蹤信息比較耗時,應(yīng)放到循環(huán)體外,放到內(nèi)部會極大的影響性能。HashMap的遍歷,使用entrySet方法的遍歷方式效率較高
因為entrySet是獲取HashMap內(nèi)部的entrySet屬性,這個屬性本來就有值,不需要遍歷獲得,而keySet每次都需要遍歷獲得且需要從hashmap通過get獲取值,所以entrySet這個方法比keySet方法少一次遍歷,效率高。開辟緩沖區(qū),緩解應(yīng)用程序上下層的性能差異
緩沖可以協(xié)調(diào)上層組件和下層組件的性能差。當(dāng)上層組件性能優(yōu)于下層組件時,可以有效的減少上層組件對下層組件的等待時間。上層應(yīng)用組件不需要等待下層組件真實地接受全部數(shù)據(jù),即可返回操作,加快了上層組件的處理速度,從而提升了系統(tǒng)整體性能。如BufferedWriter為FileWriter增加了緩沖功能。代碼性能—JAVA調(diào)優(yōu)對象復(fù)用—池
對象池化,是目前非常常用的一種系統(tǒng)優(yōu)化技術(shù)。其中最為大家所熟悉的,就是線程池和數(shù)據(jù)庫連接池。除了線程池和數(shù)據(jù)庫連接池,對于普通的java對象,在必要的時候也可以進行池化管理。Apache提供了JakartaCommonsPool對象池組件。并行替代串行
隨著多核時代的到來,CPU的并行能力有了很大的提升,傳統(tǒng)的串行技術(shù)無法發(fā)揮CPU的最大潛力,并行軟件開發(fā)技術(shù)在這方面將CPU性能發(fā)揮到極致。JAVA中提供了Thread對象和Runnable接口。代碼性能—數(shù)據(jù)庫調(diào)優(yōu)數(shù)據(jù)庫調(diào)優(yōu)—SQL調(diào)優(yōu)提高查詢效率1、對查詢進行優(yōu)化,應(yīng)盡量避免全表掃描,首先應(yīng)考慮在where及orderby涉及的列上建立索引。2、應(yīng)盡量避免在where子句中對字段進行null值判斷,否則將導(dǎo)致引擎放棄使用索引而進行全表掃描,如:selectidfromtwherenumisnull可以在num上設(shè)置默認(rèn)值0,確保表中num列沒有null值,然后這樣查詢:selectidfromtwherenum=03、應(yīng)盡量避免在where子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。4、下面的查詢也將導(dǎo)致全表掃描:selectidfromtwherenamelike'%abc%'若要提高效率,可以考慮全文檢索或者改成前綴檢索。代碼性能—數(shù)據(jù)庫調(diào)優(yōu)5、應(yīng)盡量避免在where子句中對字段進行表達式操作,這將導(dǎo)致引擎放棄使用索引而進行全表掃描。如:selectidfromtwherenum/2=100應(yīng)改為:selectidfromtwherenum=100*26、應(yīng)盡量避免在where子句中對字段進行函數(shù)操作,這將導(dǎo)致引擎放棄使用索引而進行全表掃描。7、在使用索引字段作為條件時,如果該索引是復(fù)合索引,要考慮聯(lián)合索引的可選性和前綴性,去建立正確的索引。8、很多時候用exists代替in是一個好的選擇,具體還是根據(jù)執(zhí)行計劃去分析使用exists還是in。9、并不是所有索引對查詢都有效,SQL是根據(jù)表中數(shù)據(jù)來進行查詢優(yōu)化的,當(dāng)索引列有大量數(shù)據(jù)重復(fù)時,SQL查詢可能不會去利用索引,如一表中有字段sex,男女幾乎各一半,那么即使在sex上建了索引也對查詢效率起不了作用。代碼性能—數(shù)據(jù)庫調(diào)優(yōu)10、索引并不是越多越好,索引固然可以提高相應(yīng)的select的效率,但同時也降低了insert及update的效率,因為insert或update時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。一個表的索引數(shù)最好不要超過6個,若太多則應(yīng)考慮一些不常使用到的列上建的索引是否有必要。11、避免頻繁創(chuàng)建和刪除臨時表,以減少系統(tǒng)表資源的消耗。12、在新建臨時表時,如果一次性插入數(shù)據(jù)量很大,那么可以使用selectinto代替createtable,避免造成大量log,以提高速度;如果數(shù)據(jù)量不大,為了緩和系統(tǒng)表的資源,應(yīng)先createtable,然后insert。13、如果使用到了臨時表,在存儲過程的最后務(wù)必將所有的臨時表顯式刪除,先truncatetable,然后droptable,這樣可以避免系統(tǒng)表的較長時間鎖定。代碼性能—數(shù)據(jù)庫調(diào)優(yōu)14、盡量避免大事務(wù)操作,提高系統(tǒng)并發(fā)能力。15、盡量避免向客戶端返回大數(shù)據(jù)量,若數(shù)據(jù)量過大,應(yīng)該考慮相應(yīng)需求是否合理
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度駕校場地租賃與應(yīng)急響應(yīng)預(yù)案合同3篇
- 2024版房地產(chǎn)私募基金投資合同
- 二零二五版家具行業(yè)展會策劃與執(zhí)行合作協(xié)議3篇
- 二零二五年度煤炭資源采礦權(quán)出讓合同范本深度解讀3篇
- 二零二五年度廚具安裝與廚房安全使用培訓(xùn)合同3篇
- 2024版數(shù)據(jù)采集項目采購合同范本
- 2024版祠堂承包包工合同范本
- 二零二五年度倉儲安全管理及應(yīng)急預(yù)案合同3篇
- 銀行抵押借款合同協(xié)議(財產(chǎn)抵押)
- 建筑技術(shù)服務(wù)協(xié)議合同
- 四川省綿陽市涪城區(qū)2024-2025學(xué)年九年級上學(xué)期1月期末歷史試卷(含答案)
- 2025年山東水發(fā)集團限公司社會招聘高頻重點提升(共500題)附帶答案詳解
- 2024年計算機二級WPS考試題庫(共380題含答案)
- 《湖南省房屋建筑和市政工程消防質(zhì)量控制技術(shù)標(biāo)準(zhǔn)》
- 中建集團面試自我介紹
- 《工業(yè)園區(qū)節(jié)水管理規(guī)范》
- 警校生職業(yè)生涯規(guī)劃
- 意識障礙患者的護理診斷及措施
- 2025企業(yè)年會盛典
- 215kWh工商業(yè)液冷儲能電池一體柜用戶手冊
- 場地平整施工組織設(shè)計-(3)模板
評論
0/150
提交評論