




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、J2EE系統(tǒng)優(yōu)化之對(duì)象與循環(huán)簡介J2EE系統(tǒng)優(yōu)化之對(duì)象與循環(huán)簡介條例一:盡量重用對(duì)象,避免創(chuàng)建過多短時(shí)對(duì)象對(duì)象在而向?qū)ο缶幊讨须S處可見,甚至可以毫不夸張的說是: “一切都是對(duì)象”。如何更好的創(chuàng)建和使用對(duì)象,是優(yōu)化中要考慮 的一個(gè)重要方面。筆者將對(duì)象按使用分為兩大類:獨(dú)享對(duì)象和共享 對(duì)象。獨(dú)享對(duì)象指由某個(gè)線程單獨(dú)擁有并維護(hù)其生命周期的對(duì)象,一般是通過new創(chuàng)建的對(duì)象,線程結(jié)束且無其它對(duì)這個(gè)對(duì)象的引用 , 這個(gè)對(duì)象將由垃圾收集機(jī)制自動(dòng)GC洪享對(duì)象指由多個(gè)線程共享的對(duì)象,各線程保持多個(gè)指向同一個(gè)對(duì)象的引用,任何對(duì)這個(gè)對(duì)象的 修改都會(huì)在其它引用上得到體現(xiàn),共享對(duì)象一般通過Factory 工廠 的 ge
2、tlnstaceO 方法創(chuàng)建,單例模式就是創(chuàng)建共享對(duì)象的標(biāo)準(zhǔn)實(shí)現(xiàn)。 獨(dú)享對(duì)象由于無其它指向同一對(duì)象的引用,不用擔(dān)心其它引用對(duì)對(duì)象屬性的修改,在多線程環(huán)境里,也就不需要對(duì)其可能修改屬性的 方法加以同步,減少了出錯(cuò)的隱患和復(fù)雜性,但由于需要為每個(gè)線程都創(chuàng)建對(duì)象,增加了對(duì)內(nèi)存的需求和JWGC勺負(fù)擔(dān)。共享對(duì)象則 需要進(jìn)行適當(dāng)?shù)耐剑ū苊廨^大的同步塊,同時(shí)防止死鎖)。還有幾種特殊對(duì)象:不變對(duì)象和方法對(duì)象。不變對(duì)象指對(duì)象對(duì)外 不含有修改對(duì)象屬性的方法(如 set 方法),外部要修改屬性只能通過 new新的實(shí)例來實(shí)現(xiàn)。不變對(duì)象最大的好處就是無需擔(dān)心屬性被修改,避免了潛在的 bug, 并能無需任何額外工作(如
3、同步)就很好 的工作在多線程環(huán)境下。如 jdk 的 String 對(duì)象就是典型的不變對(duì)象。 方法對(duì)象簡單的說就是僅包含方法,不含有屬性的對(duì)象。由于沒有 對(duì)象屬性,方法中無需進(jìn)行修改屬性的操作,也就能采用 static 方 法或單例模式,避免每次使用都要new對(duì)象,減少對(duì)象的使用。那么該如何確定創(chuàng)建何種對(duì)象, 這就要結(jié)合對(duì)象的使用方式和生 命周期、對(duì)象大小、構(gòu)建花銷等方而來綜合考慮。如果對(duì)象生命周 期較長,會(huì)存在修改操作, 不能容忍其它線程對(duì)其的修改, 就應(yīng)該 采用獨(dú)享對(duì)象,如常見的Bean類。而如果對(duì)象生命周期較長,且能 為各個(gè)線程共享,就可以考慮共享對(duì)象。共享有2 種常見情況,一 種是系統(tǒng)全
4、局對(duì)象,如配置屬性等,各個(gè)線程應(yīng)該引用同一對(duì)象, 任何對(duì)這個(gè)對(duì)象的修改都會(huì)影響其它線程; 另一種是由于對(duì)象創(chuàng)建開 銷較大,各線程對(duì)此對(duì)象是瞬時(shí)訪問,且無需再次讀取其屬性,如 常見的 Date 對(duì)象,一般這種對(duì)象的使用是瞬時(shí)的,比如把它format成String,如果每次創(chuàng)建然后等待GC就會(huì)浪 費(fèi)大量內(nèi)存和CPU時(shí)間,較好做法就是做成共享對(duì)象,各個(gè)線程先 set 再使用, 注意對(duì)進(jìn)行set 并訪問的方法要同步。不變對(duì)象一般使用在對(duì)象創(chuàng) 建開銷較小 ( 屬性較少, 類層次較少 ) , 且需要能自由共享的情形。 如 一個(gè)對(duì)象里的常量對(duì)象,使用publicstaticfinalAAA二newAAA)創(chuàng)
5、建。方法對(duì)象使用較廣,如Util類、DA0類等,這些對(duì)象提供操 作其它對(duì)象(一 般是 bean 對(duì)象 ) 的接口,能對(duì)系統(tǒng)在層次和功能上進(jìn)行解耦合。條例二:在循環(huán)處,多下功夫循環(huán)作為程序編寫的基本語法,可以說是隨處可見。一些小的細(xì) 節(jié)能帶來性能上的提升,而對(duì)循環(huán)體的一些改寫,能帶來性能的大 幅提升。比如最簡單的 List 遍歷,會(huì)有這樣的寫法: for(inti 二 0;i同樣是對(duì) List 的操作, 如果要在遍歷同時(shí)進(jìn)行增加和刪除操作 , 代碼如下: for (inti=0, j=l. size () ; i=0; i-) 1. remove (i) ; o經(jīng)過測試,如果采用 ArrayLi
6、st, 兩種寫法在循環(huán)次數(shù)較少時(shí)沒有太大的區(qū)別,循環(huán)次數(shù)為1000,均為Ims以內(nèi),次數(shù)為10000,前一種為60ms左右, 后一種為1ms以內(nèi),而次數(shù)上到100000,前一種為6000ms左右,后一 種為15ms,隨著循環(huán)次數(shù)的增多,后一種較前一種的效率優(yōu)勢明顯提高。這是由 Collection 庫 ArrayList 的實(shí)現(xiàn)決定的,以下是 jdkl. 3 的 ArrayList 源碼:publicObjectremove(intindex)RangeCheck( index ) ;modCount+;ObjectoldValue=elementDataindex;intnumMoved 二
7、 size-indexT ;i± (numMoved>0System, arraycopy ( elementData, index+1, elementData, index,n umMove)d ;elementData -size二 null;/LetgcdoitsworkreturnoldValue;>從中我們可以看出,numMovecR;表了需要進(jìn)行arraycopy操作的數(shù)量, 它是由 remove 的位置決定的, 如果 index=0, 也就是刪除第一個(gè)元素,則需要 arraycopy 后而的所有數(shù)據(jù),而如果 index=sizel, 則只需將最后 一個(gè)元素
8、設(shè)為 null 即可。 所以從后面 向前循環(huán) remove 是比較好的寫法。如果List中的確存在較多的add或remove操作,且容量較大 (如存儲(chǔ)幾萬個(gè)對(duì)象),則應(yīng)該采用 LinkedList 作為實(shí)現(xiàn)。 LinkedList 內(nèi)部采用雙向鏈表作為數(shù)據(jù)結(jié)構(gòu),比 ArrayList 占用較 多內(nèi)存空間,且隨機(jī)訪問操作較慢(需要從頭或尾循環(huán)到相應(yīng)位置) , 但插入刪除操作很快(僅 需進(jìn)行鏈表操作,無須大量移動(dòng)或拷貝)。對(duì)于 List 操作如果循環(huán)規(guī)模較小, 其實(shí)對(duì)性能影響非常小 ( ms 級(jí)) ,遠(yuǎn)遠(yuǎn)不是性能瓶頸所在。但心中有著優(yōu)化的意識(shí),并力求寫出 簡潔高效的程序應(yīng)該是我們每個(gè)程序員的追求。
9、而且一旦在循環(huán)規(guī)模較大時(shí),如果有了這些意識(shí),也就能有效的消除性能隱患。再舉一個(gè)與優(yōu)化無關(guān)但確實(shí)可能成為性能殺手(可以說是bug)的循環(huán)的 ' 例子。下面是源代碼:for(;totalRead<m_totalBytes;totalRead+=readBytes)readBytes=m_request, getInputStreamO. read ( m_binArray, tot alRead, m_totalBytes-totalRead ) ;這個(gè)代碼意圖很清楚,就是將一個(gè)InputStream 流讀到一個(gè)byte 數(shù)組中去。它使用 read 方法循環(huán)讀取InputStream
10、 ,該方法返 回讀取的字節(jié)數(shù)。正常情況下,該循環(huán)運(yùn)行良好,當(dāng) totalRead=m_totalBytes 時(shí),結(jié)束循環(huán), byte 數(shù)組被正常填充。 但 如果仔細(xì)看一下 InputStream 的 read方法的說明,了解一下其返回 值就會(huì)發(fā)現(xiàn),返回值可能為 -1, 即己讀到InputStream 末尾再繼續(xù)讀時(shí)。如果發(fā)生讀取異常,可能出現(xiàn)這個(gè)問題,而這個(gè)循環(huán)沒有檢查 readBytes 值是否為 -1 就往 totalRead 上加,這樣再次進(jìn)入循環(huán)體繼續(xù)讀取InputStream, 又返回 -1, 繼續(xù)循環(huán)。 如此循環(huán)直到int溢出才會(huì)跳出循環(huán)。而這個(gè)循環(huán)也就成了實(shí)實(shí)在在的CPU手,可以
11、占去大量的CP時(shí)間(取決于操作系統(tǒng))。其實(shí)解決很簡單,對(duì)readBytes 進(jìn)行判斷,如果為 -1 則跳出循環(huán)。這個(gè)例子告訴我們:對(duì)循環(huán)一定要搞清循環(huán)的循環(huán)規(guī)模、每次循 環(huán)體 執(zhí)行時(shí)間、循環(huán)結(jié)束條件包括異常情況等,只有這樣才能寫出 高效且沒 有隱患的代碼。電腦 ktv 點(diǎn)歌系統(tǒng)雙屏設(shè)置,怎么設(shè)置ktv 點(diǎn)歌系統(tǒng)雙屏(一)1、 在桌面點(diǎn)擊鼠標(biāo)右鍵, 再用鼠標(biāo)左鍵點(diǎn)擊“屬性”, 彈出下 而(圖 1)的對(duì)話框:點(diǎn)擊“設(shè)置”選項(xiàng),可以看到屏幕中間出現(xiàn)了兩個(gè)框, 1 為實(shí)線 框代表你目前正在使用的顯示器, 2 為虛線框, 代表你要設(shè)置的第 二個(gè)監(jiān)視器。如下(圖 2):點(diǎn)擊有虛線框的 2 顯示器,進(jìn)行對(duì)第
12、 2 監(jiān)視器的編輯。女嘰圖3)把“將windows桌面擴(kuò)展到該監(jiān)視器上勾選中,此時(shí)2顯示器變?yōu)閷?shí)線框,女嘰圖4)。此時(shí)你可以對(duì)2 顯示器進(jìn)行屏幕分辨率和顏 色質(zhì)量的相應(yīng)設(shè)置。為了確認(rèn)我們是否設(shè)置成功。你可以點(diǎn)擊“識(shí)別”按鈕,此時(shí)你 的電腦顯示器上會(huì)顯示一個(gè)大的口色的 1, 而你的電視機(jī)(打開電源 的電視機(jī)并且連接上顯卡的視頻輸出)上會(huì)顯示一個(gè)大的口色的 2, 說明你設(shè)置成 功。操作到這一步,你電腦ktv 點(diǎn)歌系統(tǒng)雙屏設(shè)置就成功了!是不是很簡單咧!PowerPoint ji 幻燈片制作教程一課程8:自動(dòng)切換和循環(huán)音樂(一)八、自動(dòng)切換和循環(huán)音樂 有時(shí)候我們想讓幻燈片一張一張自動(dòng)播放,同時(shí)播放一首
13、背景音 樂,從而產(chǎn)生出電影的效果,下而我們通過一個(gè)練習(xí)來學(xué)習(xí)操作;1、 插入音樂1) 啟動(dòng)PowerPoint, 自動(dòng)打開一個(gè)空白文檔;2) 點(diǎn)菜單“文件-打開”命令, 打開上一課的幻燈片“動(dòng)作設(shè)置” ?3) 選中第一張幻燈片,點(diǎn)“插入- 影片和聲音-文件中的聲音”, 在出來的提示框中選擇“自動(dòng)播放”;這樣就會(huì)在幻燈片中央出來一個(gè)小喇叭圖標(biāo), 這是我們插入的音 樂對(duì)象;點(diǎn)菜單“文件- 另存為”,以“循環(huán)切換”為文件名,保存文件 到自己的文件夾;2、 設(shè)置音樂1) 在出來的小喇叭上敲右鍵,選擇“編輯聲音對(duì)象”,出來一個(gè)對(duì)話框;把兩個(gè)勾都打上,這樣音樂就可以一直播放,直到停止,點(diǎn)“確 定”返回;2) 設(shè)置停止,在小喇叭上點(diǎn)右鍵,選擇“自定義動(dòng)畫,右邊 的窗格出來動(dòng)畫選項(xiàng);2) 在音樂右邊的下拉按鈕上點(diǎn)一下,在出來的菜單中選“效果選項(xiàng)”,出來一個(gè)面板;3) 在效果選項(xiàng)面板中,單擊中間的停止, 選擇“在 6 張幻燈片 后”,因?yàn)檠菔疚母蹇偣灿?6 張;點(diǎn)“確定”返回,保存一下文件,放映一下看看效果;3、幻燈片切換1) 選中第一張幻燈
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 主承辦單位安全協(xié)議書
- 倉儲(chǔ)一體化服務(wù)協(xié)議書
- 高空安全協(xié)議協(xié)議書
- 交房屋定金有效協(xié)議書
- 飯店樓上住戶協(xié)議書
- 車輛事故出院協(xié)議書
- 項(xiàng)目整體回購協(xié)議書
- 車間安全管理總結(jié)報(bào)告
- 食品過期調(diào)解協(xié)議書
- 送貨司機(jī)責(zé)任協(xié)議書
- 護(hù)理風(fēng)險(xiǎn)管理與護(hù)理安全
- RouterOS介紹
- 綜采工作面液壓支架壓死救活技術(shù)研究
- 十字軸鍛造成型工藝及模具設(shè)計(jì)畢業(yè)論文
- 主體結(jié)構(gòu)監(jiān)理實(shí)施細(xì)則范本
- NETWORKER+SQL Server備份實(shí)施文檔
- 控制性詳細(xì)規(guī)劃 - 寧波市規(guī)劃局
- 保潔員工考勤表
- JGJ8-2016建筑變形測量規(guī)范
- 《MSDS培訓(xùn)資料》PPT課件.ppt
- 評(píng)估反饋校長表態(tài)發(fā)言稿(精編版)
評(píng)論
0/150
提交評(píng)論