作者
為性能而設計
From Java World
[b]在設計 Java 類的時候避免性能上的冒險[/b]
[b][u]概要[/u][/b]
許多通常的 Java 性能問題都起源於在設計過程早期中的類設計的思想
開始考慮性能問題之前
以及怎麼在設計時候避免它們
(
By Brian Goetz
翻譯 by SuperMMX
閱讀整個
第一部分: 接口事宜
第二部分: 減少對象創建
第三部分: 遠程接口 (March
雖然許多程序員把性能管理一直推遲到開發過程的最後
計周期結合在一起
在這篇文章裡
臨時對象就是一些生命周期比較短的對象
序員一般用臨時變量向一個方法傳遞數據或者從一個方法返回數據
對象是怎樣給一個程序的性能帶來負面的沖擊
時對象的創建
對象創建的需求
[b][u]只是對 String 說不嗎?[/u][/b]
當它要創建臨時變量時
一個正規表達式匹配的例子
看起來無害的接口是怎樣引起大量對象的創建
的接口:
BadRegExpMatcher
[code]
public class BadRegExpMatcher {
public BadRegExpMatcher(String regExp);
/** Attempts to match the specified regular expression against the input
text
public String match(String inputText);
}
[/code]
BetterRegExpMatcher
[code]
class BetterRegExpMatcher {
public BetterRegExpMatcher(
/** Provide matchers for multiple formats of input
character array
match was made; return offset of match start if a match was
made
public int match(String inputText);
public int match(char[] inputText);
public int match(char[] inputText
/** If a match was made
the offset and the length
reconstruct the match text from the offset and length */
public int getMatchLength();
/** Convenience routine to get the match string
caller happens to wants a String */
public String getMatchText();
}
[/code]
大量使用 BadREgExpMatcher 的程序比使用 BtterRegExpMatcher 的要慢好多
調用者不得不創建一個 String 傳入 match()
返回匹配的文本
match()
它的實現中
BetterRegExpMatcher 的 match() 用原類型(整數和字符數組)代替了 String 對象; 不需
要創建中間對象來在調用者和 match() 之間傳遞信息
既然在設計時候避免性能問題要比寫完整個系統以後再修改要容易一些
類中控制對象創建的方法
對象
以外
[b][u]不可變性對於性能來說是否很壞?[/u][/b]
因為 String 經常和大量的對象創建聯系在一起
程序員認為不可變的對象與生俱來對性能沒有好處
際上
變性對性能來說有幫助或者有害
程序經常處理和修改文本字符串
想查找和解析出前綴或者子串
一個新的 String 對象
對象)
另一個方面
修改
[b][u]可變的對象有它們自己的臨時對象問題
在 RegExpMatcher 的例子中
需要新建一個 String 對象
象而不是一個原類型
象創建
只是四個整數(x
getBounds()作為一個Rectangle 返回
[code]
public class Component {
public Rectangle getBounds();
}
[/code]
在上面的例子中
些狀態信息可用
getBounds() 可能的實現
[code]
public class Component {
protected Rectangle myBounds;
public Rectangle getBounds() { return myBounds; }
}
[/code]
當一個調用者調用上面例子中的 getBounds()
在哪裡
一個調用者運行一下程序會發生什麼呢?
[code]
Rectangle r = component
r
[/code]
因為 Rectangle 是可變的
AWT 這樣的 GUI 工具箱來說
件監聽器需要被通知
危險
[code]
public Rectangle getBounds() {
return new Rectangle(myBounds
myBounds
}
[/code]
但是現在
實際上
[code]
int x = component
int y = component
int h = component
int w = component
[/code]
在 String 的情況中
對象的創建也是必要的
在我們的接口中沒有使用對象
可行的或者是希望的
小對象的問題
[b][u]減少對象的技巧
在 Swing 工具箱的初始版本中
極大地阻礙了性能
來更有效
過給 Component 和其他一些類加一些新的存取方法
[code]
public int getX() { return myBounds
public int getY() { return myBounds
public int getHeight() {
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27468.html