JAVA語言中提供了try/catch來發方便用戶捕捉異常
(
如果可以用if
(
在必須要進行異常的處理時
一個高性能的應用程序中一般都會用到線程
例
Vector主要用來保存各種類型的對象(包括相同類型和不同類型的對象)
public class StringVector
{
private String[] data;
private int count;
public StringVector() { this(
public StringVector(int initialSize)
{
data = new String[initialSize];
}
public void add(String str)
{
// ignore null strings
if(str == null) { return; }
ensureCapacity(count +
data[count++] = str;
}
private void ensureCapacity(int minCapacity)
{
int oldCapacity = data
if (minCapacity > oldCapacity)
{
String oldData[] = data;
int newCapacity = oldCapacity *
data = new String[newCapacity];
System
}
}
public void remove(String str)
{
if(str == null) { return // ignore null str }
for(int i =
{
// check for a match
if(data[i]
{
System
// allow previously valid array element be gc
data[
return;
}
}
}
public final String getStringAt(int index) {
if(index < 0) { return null; }
else if(index > count)
{
return null; // index is > # strings
}
else { return data[index]; // index is good }
}
/* * * * * * * * * * * * * * * *StringVector
因此
Vector Strings=new Vector();
Strings
Strings
String Second=(String)Strings
可以用如下的代碼替換
StringVector Strings=new StringVector();
Strings
Strings
String Second=Strings
這樣就可以通過優化線程來提高JAVA程序的性能
import java
public class TestCollection
{
public static void main(String args [])
{
TestCollection collect = new TestCollection();
if(args
{
System
System
}
if(args[
{
Vector store = new Vector();
long start = System
for(int i =
{
store
}
long finish = System
System
start = System
for(int i =
{
String result = (String)store.elementAt(i);
}
finish = System.currentTimeMillis();
System.out.println((finish-start));
}
else if(args[0].equals("stringvector"))
{
StringVector store = new StringVector();
long start = System.currentTimeMillis();
for(int i = 0; i < 1000000; i++) { store.add("string"); }
long finish = System.currentTimeMillis();
System.out.println((finish-start));
start = System.currentTimeMillis();
for(int i = 0; i < 1000000; i++) {
String result = store.getStringAt(i);
}
finish = System.currentTimeMillis();
System.out.println((finish-start));
}
}
}
/* * * * * * * * * * * * * * * *TestCollection.java * * * * * * * * * * * * * * * * */
測試的結果如下(假設標准的時間為1,越小性能越好):
關於線程的操作,要注意如下幾個方面。tW.wingwit.cOM
(1) 防止過多的同步
如上所示,不必要的同步常常會造成程序性能的下降。因此,如果程序是單線程,則一定不要使用同步。
(2) 同步方法而不要同步整個代碼段
對某個方法或函數進行同步比對整個代碼段進行同步的性能要好。
(3) 對每個對象使用多”鎖”的機制來增大並發。
一般每個對象都只有一個”鎖”,這就表明如果兩個線程執行一個對象的兩個不同的同步方法時,會發生”死鎖”。即使這兩個方法並不共享任何資源。為了避免這個問題,可以對一個對象實行”多鎖”的機制。如下所示:
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)
輸入和輸出包括很多方面,但涉及最多的是對硬盤,網絡或數據庫的讀寫操作。對於讀寫操作,又分為有緩存和沒有緩存的;對於數據庫的操作,又可以有多種類型的JDBC驅動器可以選擇。但無論怎樣,都會給程序的性能帶來影響。因此,需要注意如下幾點:
(1) 使用輸入輸出緩沖
盡可能的多使用緩存。但如果要經常對緩存進行刷新(flush),則建議不要使用緩存。
(2) 輸出流(Output Stream)和Unicode字符串
當時用Output Stream和Unicode字符串時,Write類的開銷比較大。因為它要實現Unicode到字節(byte)的轉換.因此,如果可能的話,在使用Write類之前就實現轉換或用OutputStream類代替Writer類來使用。
(3) 當需序列化時使用transient
當序列化一個類或對象時,對於那些原子類型(atomic)或可以重建的原素要表識為transient類型。這樣就不用每一次都進行序列化。如果這些序列化的對象要在網絡上傳輸,這一小小的改變對性能會有很大的提高。
(4) 使用高速緩存(Cache)
對於那些經常要使用而又不大變化的對象或數據,可以把它存儲在高速緩存中。這樣就可以提高訪問的速度。這一點對於從數據庫中返回的結果集尤其重要。
(5) 使用速度快的JDBC驅動器(Driver)
JAVA對訪問數據庫提供了四種方法。這其中有兩種是JDBC驅動器。一種是用JAVA外包的本地驅動器;另一種是完全的JAVA驅動器。具體要使用哪一種得根據JAVA布署的環境和應用程序本身來定。
5.一些其他的經驗和技巧
(1) 使用局部變量
(2) 避免在同一個類中動過調用函數或方法(get或set)來設置或調用變量。
(3) 避免在循環中生成同一個變量或調用同一個函數(參數變量也一樣)
(4) 盡可能的使用static,final,private等關鍵字
(5) 當復制大量數據時,使用System.arraycopy()命令。
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19392.html