當前位置:學者齋 >

IT認證 >J2EE >

J2EE系統優化之物件與迴圈簡介

J2EE系統優化之物件與迴圈簡介

  • J2EE
  • 關注:6.92K次

優化一般意義上說是提高已有系統的效能,減少如記憶體、資料庫、網路頻寬等資源的佔用,是在系統開發告一段落的前提下進行。yjbys小編分享一篇J2EE系統優化之物件與迴圈給大家,希望大家認真閱讀!

J2EE系統優化之物件與迴圈簡介

條例一:儘量重用物件,避免建立過多短時物件

物件在面向物件程式設計中隨處可見,甚至可以毫不誇張的說是:“一切都是物件”。如何更好的建立和使用物件,是優化中要考慮的一個重要方面。筆者將物件按使用分為兩大類:獨享物件和共享物件。獨享物件指由某個執行緒單獨擁有並維護其生命週期的物件,一般是通過new 建立的物件,執行緒結束且無其它對這個物件的引用,這個物件將由垃圾收集機制自動GC。共享物件指由多個執行緒共享的物件,各執行緒保持多個指向同一個物件的引用,任何對這個物件的修改都會在其它引用上得到體現,共享物件一般通過Factory工廠的getInstace()方法建立,單例模式就是建立共享物件的標準實現。獨享物件由於無其它指向同一物件的引用,不用擔心其它引用對物件屬性的修改,在多執行緒環境裡,也就不需要對其可能修改屬性的方法加以同步,減少了出錯的隱患和複雜性,但由於需要為每個執行緒都建立物件,增加了對記憶體的需求和JVM GC的負擔。共享物件則需要進行適當的同步(避免較大的同步塊,同時防止死鎖)。

還有幾種特殊物件:不變物件和方法物件。不變物件指物件對外不含有修改物件屬性的方法(如set方法),外部要修改屬性只能通過new新的例項來實現。不變物件最大的好處就是無需擔心屬性被修改,避免了潛在的bug,並能無需任何額外工作(如同步)就很好的工作在多執行緒環境下。如jdk的 String物件就是典型的不變物件。方法物件簡單的說就是僅包含方法,不含有屬性的物件。由於沒有物件屬性,方法中無需進行修改屬性的操作,也就能採用 static方法或單例模式,避免每次使用都要new物件,減少物件的使用。

那麼該如何確定建立何種物件,這就要結合物件的使用方式和生命週期、物件大小、構建花銷等方面來綜合考慮。如果物件生命週期較長,會存在修改操作,不能容忍其它執行緒對其的修改,就應該採用獨享物件,如常見的Bean類。而如果物件生命週期較長,且能為各個執行緒共享,就可以考慮共享物件。共享有2 種常見情況,一種是系統全域性物件,如配置屬性等,各個執行緒應該引用同一物件,任何對這個物件的修改都會影響其它執行緒;另一種是由於物件建立開銷較大,各執行緒對此物件是瞬時訪問,且無需再次讀取其屬性,如常見的Date 物件,一般這種物件的使用是瞬時的,比如把它format成String,如果每次建立然後等待GC就會浪費大量記憶體和CPU時間,較好做法就是做成共享物件,各個執行緒先set再使用,注意對進行set並訪問的方法要同步。不變物件一般使用在物件建立開銷較小(屬性較少,類層次較少),且需要能自由共享的情形。如一個物件裡的常量物件,使用public static final AAA=new AAA(…) 建立。方法物件使用較廣,如Util類、DAO類等,這些物件提供操作其它物件(一般是bean物件)的介面,能對系統在層次和功能上進行解耦合。

條例二:在迴圈處,多下功夫

迴圈作為程式編寫的基本語法,可以說是隨處可見。一些小的細節能帶來效能上的提升,而對迴圈體的一些改寫,能帶來效能的大幅提升。

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

同樣是對List的'操作,如果要在遍歷同時進行增加和刪除操作,程式碼如下:for(int i=0,j=();i=0;i--){ve(i);}。經過測試,如果採用ArrayList,兩種寫法在迴圈次數較少時沒有太大的區別,迴圈次數為1000,均為1ms以內,次數為10000,前一種為60ms左右,後一種為1ms以內,,而次數上到100000,前一種為 6000ms左右,後一種為15ms,隨著迴圈次數的增多,後一種較前一種的效率優勢明顯提高。

這是由Collection庫ArrayList的實現決定的,以下是jdk1.3的ArrayList原始碼:

public Object remove(int index)

RangeCheck(index);

modCount++;

Object oldValue = elementData[index];

int numMoved = size - index - 1;

if (numMoved > 0)

ycopy(elementData, index+1, elementData, index,numMoved);

elementData[--size] = null;

// Let gc do its workreturn oldValue;

>

從中我們可以看出,numMoved代表了需要進行arraycopy操作的數量,它是由remove的位置決定的,如果index=0,也就是刪除第一個元素,則需要arraycopy後面的所有資料,而如果index=size-1,則只需將最後一個元素設為null即可。所以從後面向前迴圈 remove是比較好的寫法。

如果List中的確存在較多的add或remove操作,且容量較大(如儲存幾萬個物件),則應該採用LinkedList作為實現。LinkedList內部採用雙向連結串列作為資料結構,比ArrayList佔用較多記憶體空間,且隨機訪問操作較慢(需要從頭或尾迴圈到相應位置),但插入刪除操作很快(僅需進行連結串列操作,無須大量移動或拷貝)。

對於List操作如果迴圈規模較小,其實對效能影響非常小(ms級),遠遠不是效能瓶頸所在。但心中有著優化的意識,併力求寫出簡潔高效的程式應該是我們每個程式設計師的追求。而且一旦在迴圈規模較大時,如果有了這些意識,也就能有效的消除效能隱患。

再舉一個與優化無關但確實可能成為效能殺手(可以說是bug)的迴圈的例子。下面是原始碼:

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

readBytes = m_nputStream()(m_binArray, totalRead, m_totalBytes - totalRead);

這個程式碼意圖很清楚,就是將一個InputStream流讀到一個byte陣列中去。它使用read方法迴圈讀取InputStream,該方法返回讀取的位元組數。正常情況下,該迴圈執行良好,當totalRead=m_totalBytes時,結束迴圈,byte陣列被正常填充。但如果仔細看一下 InputStream的read方法的說明,瞭解一下其返回值就會發現,返回值可能為-1,即已讀到InputStream末尾再繼續讀時。如果發生讀取異常,可能出現這個問題,而這個迴圈沒有檢查readBytes值是否為-1就往totalRead上加,這樣再次進入迴圈體繼續讀取 InputStream,又返回-1,繼續迴圈。如此迴圈直到int溢位才會跳出迴圈。而這個迴圈也就成了實實在在的CPU殺手,可以佔去大量的CPU時間(取決於作業系統)。其實解決很簡單,對readBytes進行判斷,如果為-1則跳出迴圈。

這個例子告訴我們:對迴圈一定要搞清迴圈的迴圈規模、每次迴圈體執行時間、迴圈結束條件包括異常情況等,只有這樣才能寫出高效且沒有隱患的程式碼。

電腦ktv點歌系統雙屏設定,怎麼設定ktv點歌系統雙屏(一)

KTV的點歌系統是需要設定雙屏的,我們應該怎麼設定呢,下面小編帶領大家一學習如何設定電腦KTV點歌系統雙屏設定

1、在桌面點選滑鼠右鍵,再用滑鼠左鍵點選“屬性”,彈出下面(圖1)的對話方塊:

點選“設定”選項,可以看到螢幕中間出現了兩個框,1為實線框代表你目前正在使用的顯示器,2為虛線框,代表你要設定的第二個監視器。如下(圖2):

點選有虛線框的2顯示器,進行對第2監視器的編輯。如(圖3)

把“將windows桌面擴充套件到該監視器上勾選中,此時2顯示器變為實線框,如(圖4)。此時你可以對2顯示器進行螢幕解析度和顏色質量的相應設定。

為了確認我們是否設定成功。你可以點選“識別”按鈕,此時你的電腦顯示器上會顯示一個大的白色的1,而你的電視機(開啟電源的電視機並且連線上顯示卡的視訊輸出)上會顯示一個大的白色的2,說明你設定成功。

操作到這一步,你電腦ktv點歌系統雙屏設定就成功了!是不是很簡單咧!

PowerPointji幻燈片製作教程—課程8:自動切換和迴圈音樂(一)

八、自動切換和迴圈音樂

有時候我們想讓幻燈片一張一張自動播放,同時播放一首背景音樂,從而產生出電影的效果,下面我們通過一個練習來學習操作;

1、插入音樂

1)啟動PowerPoint,自動開啟一個空白文件 ;

2)點選單“檔案- 開啟”命令, 開啟上一課的幻燈片“動作設定”;

3)選中第一張幻燈片,點“插入-影片和聲音-檔案中的聲音..”,在出來的提示框中選擇“自動播放”;

這樣就會在幻燈片中央出來一個小喇叭圖示,這是我們插入的音樂物件;

點選單“檔案-另存為”,以“迴圈切換”為檔名,儲存檔案到自己的資料夾;

2、設定音樂

1)在出來的小喇叭上敲右鍵,選擇“編輯聲音物件”,出來一個對話方塊;

把兩個勾都打上,這樣音樂就可以一直播放,直到停止,點“確定”返回;

2)設定停止,在小喇叭上點右鍵,選擇“自定義動畫..”,右邊的窗格出來動畫選項;

2)在音樂右邊的下拉按鈕上點一下,在出來的選單中選“效果選項”,出來一個面板;

3)在效果選項面板中,單擊中間的停止,選擇“在 6張幻燈片後”,因為簡報總共有6張;

點“確定”返回,儲存一下檔案,放映一下看看效果;

3、幻燈片切換

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

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

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

4)點一下下邊的“應用於所有幻燈片”按鈕,這樣所有的幻燈片都是每隔5秒切換;

當然也可以一張一張設定,那些需要自動切換的幻燈片;

5)儲存一下檔案,放映一下看看效果,是否是每隔5秒就自動到下一張幻燈片,同時一直播放音樂;

標籤: 系統優化 J2EE
  • 文章版權屬於文章作者所有,轉載請註明 https://xuezhezhai.com/zh-tw/itrz/j2ee/15rxk0.html