2013-01-03 54 views
1

...或者必須拋出異常,以影響性能?Java:*能力*拋出檢查異常減慢速度?

請參閱接受的答案here。這是我想實現的東西,如果以這種方式創建實例不會讓事情變得非常緩慢。 (我有成千上萬的對象來創建每一秒,粒子系統等等,所以不是,考慮到在Java中使用檢查的異常時存在的性能影響,這並不是不成熟的優化過程,謝謝。)

+3

相比於什麼,緩慢的事情,究竟是什麼? –

+1

現代JVM上不是真的,沒有。輸入一個try {}過去會有一些有意義的成本,但是從熱點開始就已經被調整了。不是一個答案,因爲我現在沒有時間找到引用,對不起:( – Affe

回答

3

你每秒可以創建數千萬個對象。對於成千上萬的我來說,除非在分析器中看到問題,否則不會擔心性能。我也擔心先讓代碼清晰和正確,然後再考慮分析代碼。

代碼中的異常幾乎沒有影響(除了讓代碼稍微大一點)拋出異常很昂貴,但是您可以每秒拋出數千個異常,並且仍然不會嚴重影響您的應用程序性能。 (bug的代碼是不是一件好事都一樣)

public static void main(String... args) { 
    long start = System.nanoTime(); 
    int runs = 10000000; 
    for (int i = 0; i < runs; i++) { 
     try { 
      throwsException(); 
     } catch (Exception ignored) { 
     } 
    } 
    long time = System.nanoTime() - start; 
    System.out.printf("Took an average of %.3f micro-second per exception%n", time/runs/1e3); 
} 

private static void throwsException() throws Exception { 
    throw new Exception("Ignored"); 
} 

該測試拋出超過一百萬new Exception s每秒

Took an average of 0.744 micro-second per exception 
+0

Peter,這裏的問題不僅僅是構造,而是GC。我使用的是對象池,但是我想這隻會緩解事情。在手機上啓動 –

+0

在手機上你的資源有限,即使如此,每秒千次也不會成爲問題 –

+1

@NickWiggill查看我添加的微基準 –

1

在try..catch塊做細微的差異。拋出異常有一個小小的懲罰(可能可以忽略不計,但可能不是在一些舊的或供電不足的硬件上)。

如果GC是一個問題,並且由於流量控制的原因而想拋出異常,但對異常的細節不感興趣,除了其類型外,可以使用重複使用異常對象。一次創建它們作爲常量,然後在需要時拋出它們。

但說了這一切,我會等到你知道你有一個性能問題,然後配置文件來解決如何解決它。通常情況下,這不是你認爲的事情。

+0

爲了將來的參考,重用異常很有趣 - - 謝謝。 –