iT邦幫忙

6

淺談:Java代碼的優化策略

文章來源我的部落格:http://blog.itcert.org/
1.如何使用Exception
Exception降低性能。一個異常拋出首先需要創建一個新的對象。 Throwable接口中的構造器調用名為fillInStackTrace()的本地方法。這個方法負責巡檢棧的整個框架來收集跟踪信息。這樣無論何時有異常拋出,它要求虛擬機裝載調用棧,因為一個新的對像在中部被創建。

異常應當僅用於有錯誤發生時,而不要控制流。

2.不要兩次初始化變量

Java通過調用獨特的類構造器默認地初始化變量為一個已知的值。所有的對像被設置成null,integers (byte, short, int, long)被設置成0,float和double設置成0.0,Boolean變量設置成false。這對那些擴展自其它類的類尤其重要,這跟使用一個新的關鍵詞創建一個對象時所有一連串的構造器被自動調用一樣。

3.在任何可能的地方讓類為Final

標記為final的類不能被擴展。在《核心Java API》中有大量這個技術的例子,諸如java.lang.String。將String類標記為final阻止了開發者創建他們自己實現的長度方法。

更深入點說,如果類是final的,所有類的方法也是final的。 Java編譯器可能會內聯所有的方法(這依賴於編譯器的實現)。在我的測試裡,我已經看到性能平均增加了50%。

4.在任何可能的地方使用局部變量

屬於方法調用部分的自變量和聲明為此調用一部分的臨時變量存儲在棧中,這比較快。諸如static,實例(instance)變量和新的對象創建在堆中,這比較慢。局部變量的更深入優化依賴於你正在使用的編譯器或虛擬機。

5.停止小聰明

很多開發人員在腦子中編寫可複用和靈活的代碼,而有時候在他們的程序中就產生額外的開銷。曾經或者另外的時候他們編寫了類似這樣的代碼:

public void doSomething(File file) {
FileInputStream fileIn = new FileInputStream(file);
// do something

他夠靈活,但是同時他們也產生了更多的開銷。這個主意背後做的事情是操縱一個InputStream,而不是一個文件,因此它應該重寫如下:

public void doSomething(InputStream inputStream){
// do something

6.乘法和除法

我有太多的東東適用於摩爾法則——它聲明CPU功率每年成倍增長。 “摩爾法則”表明每年由開發者所寫的差勁的代碼數量三倍增加,劃去了摩爾法則的任何好處。

考慮下面的代碼:

for (val = 0; val < 100000; val +=5) { shiftX = val 8; myRaise = val 2; }

如果我們狡猾的利用位移(bit),性能將會六倍增加。這是重寫的代碼:
.
.
.
.

全文閱讀:http://blog.itcert.org/archives/1026


尚未有邦友留言

立即登入留言