測試的結(jié)果如下(假設(shè)標(biāo)準(zhǔn)的時間為1,越小性能越好):
關(guān)于線程的操作,要注意如下幾個方面。
(1) 防止過多的同步
如上所示,不必要的同步常常會造成程序性能的下降。因此,如果程序是單線程,則一定不要使用同步。
(2) 同步方法而不要同步整個代碼段
對某個方法或函數(shù)進(jìn)行同步比對整個代碼段進(jìn)行同步的性能要好。
(3) 對每個對象使用多”鎖”的機(jī)制來增大并發(fā)。
一般每個對象都只有一個”鎖”,這就表明如果兩個線程執(zhí)行一個對象的兩個不同的同步方法時,會發(fā)生”死鎖”。即使這兩個方法并不共享任何資源。為了避免這個問題,可以對一個對象實行”多鎖”的機(jī)制。如下所示:
class foo
{
private static int var1;
private static Object lock1=new Object();
private static int var2;
private static Object lock2=new Object();
public static void increment1()
{
synchronized(lock1)
{
var1++;
}
}
public static void increment2()
{
synchronized(lock2)
{
var2++;
}
}
}
4.輸入和輸出(I/O)
輸入和輸出包括很多方面,但涉及最多的是對硬盤,網(wǎng)絡(luò)或數(shù)據(jù)庫的讀寫操作。對于讀寫操作,又分為有緩存和沒有緩存的;對于數(shù)據(jù)庫的操作,又可以有多種類型的JDBC驅(qū)動器可以選擇。但無論怎樣,都會給程序的性能帶來影響。因此,需要注意如下幾點(diǎn):
(1) 使用輸入輸出緩沖
盡可能的多使用緩存。但如果要經(jīng)常對緩存進(jìn)行刷新(flush),則建議不要使用緩存。
(2) 輸出流(Output Stream)和Unicode字符串
當(dāng)時用Output Stream和Unicode字符串時,Write類的開銷比較大。因為它要實現(xiàn)Unicode到字節(jié)(byte)的轉(zhuǎn)換.因此,如果可能的話,在使用Write類之前就實現(xiàn)轉(zhuǎn)換或用OutputStream類代替Writer類來使用。
(3) 當(dāng)需序列化時使用transient
當(dāng)序列化一個類或?qū)ο髸r,對于那些原子類型(atomic)或可以重建的原素要表識為transient類型。這樣就不用每一次都進(jìn)行序列化。如果這些序列化的對象要在網(wǎng)絡(luò)上傳輸,這一小小的改變對性能會有很大的提高?! ?nbsp;
(4) 使用高速緩存(Cache)
對于那些經(jīng)常要使用而又不大變化的對象或數(shù)據(jù),可以把它存儲在高速緩存中。這樣就可以提高訪問的速度。這一點(diǎn)對于從數(shù)據(jù)庫中返回的結(jié)果集尤其重要。
(5) 使用速度快的JDBC驅(qū)動器(Driver)
JAVA對訪問數(shù)據(jù)庫提供了四種方法。這其中有兩種是JDBC驅(qū)動器。一種是用JAVA外包的本地驅(qū)動器;另一種是完全的JAVA驅(qū)動器。具體要使用哪一種得根據(jù)JAVA布署的環(huán)境和應(yīng)用程序本身來定。
5.一些其他的經(jīng)驗和技巧
(1) 使用局部變量
(2) 避免在同一個類中動過調(diào)用函數(shù)或方法(get或set)來設(shè)置或調(diào)用變量。
(3) 避免在循環(huán)中生成同一個變量或調(diào)用同一個函數(shù)(參數(shù)變量也一樣)
(4) 盡可能的使用static,final,private等關(guān)鍵字
(5) 當(dāng)復(fù)制大量數(shù)據(jù)時,使用System.arraycopy()命令。