• <sub id="h4knl"><ol id="h4knl"></ol></sub>
    <sup id="h4knl"></sup>
      <sub id="h4knl"></sub>

      <sub id="h4knl"><ol id="h4knl"><em id="h4knl"></em></ol></sub><s id="h4knl"></s>
      1. <strong id="h4knl"></strong>

      2. J2EE系統(tǒng)優(yōu)化之對(duì)象與循環(huán)簡介

        時(shí)間:2024-08-23 06:50:16 J2EE培訓(xùn) 我要投稿
        • 相關(guān)推薦

        J2EE系統(tǒng)優(yōu)化之對(duì)象與循環(huán)簡介

          優(yōu)化一般意義上說是提高已有系統(tǒng)的性能,減少如內(nèi)存、數(shù)據(jù)庫、網(wǎng)絡(luò)帶寬等資源的占用,是在系統(tǒng)開發(fā)告一段落的前提下進(jìn)行。yjbys小編分享一篇J2EE系統(tǒng)優(yōu)化之對(duì)象與循環(huán)給大家,希望大家認(rè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工廠的getInstace()方法創(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)存的需求和JVM GC的負(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,并能無需任何額外工作(如同步)就很好的工作在多線程環(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)全局對(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ì)象,使用public static final AAA=new AAA(…) 創(chuàng)建。方法對(duì)象使用較廣,如Util類、DAO類等,這些對(duì)象提供操作其它對(duì)象(一般是bean對(duì)象)的接口,能對(duì)系統(tǒng)在層次和功能上進(jìn)行解耦合。

          條例二:在循環(huán)處,多下功夫

          循環(huán)作為程序編寫的基本語法,可以說是隨處可見。一些小的細(xì)節(jié)能帶來性能上的提升,而對(duì)循環(huán)體的一些改寫,能帶來性能的大幅提升。

          比如最簡單的List遍歷,會(huì)有這樣的寫法:for(int i=0;i

          同樣是對(duì)List的操作,如果要在遍歷同時(shí)進(jìn)行增加和刪除操作,代碼如下:for(int i=0,j=l.size();i=0;i--){l.remove(i);}。經(jīng)過測試,如果采用ArrayList,兩種寫法在循環(huán)次數(shù)較少時(shí)沒有太大的區(qū)別,循環(huán)次數(shù)為1000,均為1ms以內(nèi),次數(shù)為10000,前一種為60ms左右,后一種為1ms以內(nèi),,而次數(shù)上到100000,前一種為 6000ms左右,后一種為15ms,隨著循環(huán)次數(shù)的增多,后一種較前一種的效率優(yōu)勢(shì)明顯提高。

          這是由Collection庫ArrayList的實(shí)現(xiàn)決定的,以下是jdk1.3的ArrayList源碼:

          public Object remove(int index)

          RangeCheck(index);

          modCount++;

          Object oldValue = elementData[index];

          int numMoved = size - index - 1;

          if (numMoved > 0)

          System.arraycopy(elementData, index+1, elementData, index,numMoved);

          elementData[--size] = null;

          // Let gc do its workreturn oldValue;

          >

          從中我們可以看出,numMoved代表了需要進(jìn)行arraycopy操作的數(shù)量,它是由remove的位置決定的,如果index=0,也就是刪除第一個(gè)元素,則需要arraycopy后面的所有數(shù)據(jù),而如果index=size-1,則只需將最后一個(gè)元素設(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è)程序員的追求。而且一旦在循環(huán)規(guī)模較大時(shí),如果有了這些意識(shí),也就能有效的消除性能隱患。

          再舉一個(gè)與優(yōu)化無關(guān)但確實(shí)可能成為性能殺手(可以說是bug)的循環(huán)的例子。下面是源代碼:

          for(; totalRead < m_totalBytes; totalRead += readBytes)

          readBytes = m_request.getInputStream().read(m_binArray, totalRead, m_totalBytes - totalRead);

          這個(gè)代碼意圖很清楚,就是將一個(gè)InputStream流讀到一個(gè)byte數(shù)組中去。它使用read方法循環(huán)讀取InputStream,該方法返回讀取的字節(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殺手,可以占去大量的CPU時(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)雙屏(一)

          KTV的點(diǎn)歌系統(tǒng)是需要設(shè)置雙屏的,我們應(yīng)該怎么設(shè)置呢,下面小編帶領(lǐng)大家一學(xué)習(xí)如何設(shè)置電腦KTV點(diǎn)歌系統(tǒng)雙屏設(shè)置

          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ì)第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è)置就成功了!是不是很簡單咧!

          PowerPointji幻燈片制作教程—課程8:自動(dòng)切換和循環(huán)音樂(一)

          八、自動(dòng)切換和循環(huán)音樂

          有時(shí)候我們想讓幻燈片一張一張自動(dòng)播放,同時(shí)播放一首背景音樂,從而產(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)檠菔疚母蹇偣灿?張;

          點(diǎn)“確定”返回,保存一下文件,放映一下看看效果;

          3、幻燈片切換

          1)選中第一張幻燈片,點(diǎn)菜單“幻燈片放映-幻燈片切換”;

          2)右邊的窗格中出現(xiàn)許多切換效果,可以選擇一種;

          3)在下邊的換片方式中,去掉“單擊..”的勾,勾選下面的“每隔”,在旁邊的時(shí)間中輸入5秒;

          4)點(diǎn)一下下邊的“應(yīng)用于所有幻燈片”按鈕,這樣所有的幻燈片都是每隔5秒切換;

          當(dāng)然也可以一張一張?jiān)O(shè)置,那些需要自動(dòng)切換的幻燈片;

          5)保存一下文件,放映一下看看效果,是否是每隔5秒就自動(dòng)到下一張幻燈片,同時(shí)一直播放音樂;

        【J2EE系統(tǒng)優(yōu)化之對(duì)象與循環(huán)簡介】相關(guān)文章:

        J2EE系統(tǒng)優(yōu)化:對(duì)象與循環(huán)08-16

        J2EE的簡介08-21

        J2EE簡介07-22

        J2EE技術(shù)簡介08-05

        系統(tǒng)內(nèi)存優(yōu)化方法06-21

        項(xiàng)目管理系統(tǒng)簡介08-20

        windows系統(tǒng)內(nèi)存優(yōu)化技巧07-01

        電腦系統(tǒng)怎么優(yōu)化09-19

        windows系統(tǒng)內(nèi)存的優(yōu)化技巧08-02

        J2EE的13種核心技術(shù)簡介10-06

        国产高潮无套免费视频_久久九九兔免费精品6_99精品热6080YY久久_国产91久久久久久无码
      3. <sub id="h4knl"><ol id="h4knl"></ol></sub>
        <sup id="h4knl"></sup>
          <sub id="h4knl"></sub>

          <sub id="h4knl"><ol id="h4knl"><em id="h4knl"></em></ol></sub><s id="h4knl"></s>
          1. <strong id="h4knl"></strong>

          2. 偷偷碰偷偷鲁免费视频一区 | 有码日韩激情中文视频 | 亚洲中文字无幕码中文字 | 日韩精品一区二区三区在线观看l | 中文字幕精品视频在线观 | 日本人成ⅴ在线观看免费 |