使用異常處理正常的代碼流很糟糕 - 速度很慢,代碼質量很差,從第1天起,我們都會把這種情況帶入我們的頭腦中。至少我有!這也是有道理的,異常每次調用時都會生成堆棧跟蹤,堆棧跟蹤需要很長時間才能生成,因此拋出和捕獲的異常比等效的if語句慢得多。Java中異常的速度
所以我決定做一個快速的例子來證明這一點。
public static void main(String[] args) throws Exception {
Object[] objs = new Object[500000];
for (int i = 0; i < objs.length; i++) {
if (Math.random() < 0.5) {
objs[i] = new Object();
}
}
long cur = System.currentTimeMillis();
for (Object o : objs) {
try {
System.out.print(o.getClass());
}
catch (Exception e) {
System.out.print("null");
}
}
System.err.println("Try/catch: "+(System.currentTimeMillis() - cur));
cur = System.currentTimeMillis();
for (Object o : objs) {
if(o==null) {
System.out.print("null");
}
else {
System.out.print(o.getClass());
}
}
System.err.println("If: "+(System.currentTimeMillis() - cur));
}
然而,上運行的代碼,我吃驚地看到以下內容:
Try/catch: 11204
If: 11953
我再次運行代碼,此時 「如果」 是快:
Try/catch: 12188
If: 12187
。 ..但只有一個毫秒。
這是所有在服務器虛擬機上運行的,我知道大部分時間都會被print()
語句佔用,有些運行會顯示速度比try/catch快。但無論如何,他們當然不應該接近?那麼如何生成堆棧跟蹤比單個if語句更快呢?
編輯:爲了澄清,這個問題是一個純粹的學術 - 我知道使用正常代碼流的異常是很好,絕對不會這樣做!
謝謝,該通訊解釋得相當好。我以前看過它,但沒有那篇文章! – berry120 2011-01-30 00:26:06