...或者必須拋出異常爲,以影響性能?Java:*能力*拋出檢查異常減慢速度?
請參閱接受的答案here。這是我想實現的東西,如果以這種方式創建實例不會讓事情變得非常緩慢。 (我有成千上萬的對象來創建每一秒,粒子系統等等,所以不是,考慮到在Java中使用檢查的異常時存在的性能影響,這並不是不成熟的優化過程,謝謝。)
...或者必須拋出異常爲,以影響性能?Java:*能力*拋出檢查異常減慢速度?
請參閱接受的答案here。這是我想實現的東西,如果以這種方式創建實例不會讓事情變得非常緩慢。 (我有成千上萬的對象來創建每一秒,粒子系統等等,所以不是,考慮到在Java中使用檢查的異常時存在的性能影響,這並不是不成熟的優化過程,謝謝。)
你每秒可以創建數千萬個對象。對於成千上萬的我來說,除非在分析器中看到問題,否則不會擔心性能。我也擔心先讓代碼清晰和正確,然後再考慮分析代碼。
代碼中的異常幾乎沒有影響(除了讓代碼稍微大一點)拋出異常很昂貴,但是您可以每秒拋出數千個異常,並且仍然不會嚴重影響您的應用程序性能。 (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
Peter,這裏的問題不僅僅是構造,而是GC。我使用的是對象池,但是我想這隻會緩解事情。在手機上啓動 –
在手機上你的資源有限,即使如此,每秒千次也不會成爲問題 –
@NickWiggill查看我添加的微基準 –
在try..catch塊做細微的差異。拋出異常有一個小小的懲罰(可能可以忽略不計,但可能不是在一些舊的或供電不足的硬件上)。
如果GC是一個問題,並且由於流量控制的原因而想拋出異常,但對異常的細節不感興趣,除了其類型外,可以使用重複使用異常對象。一次創建它們作爲常量,然後在需要時拋出它們。
但說了這一切,我會等到你知道你有一個性能問題,然後配置文件來解決如何解決它。通常情況下,這不是你認爲的事情。
爲了將來的參考,重用異常很有趣 - - 謝謝。 –
相比於什麼,緩慢的事情,究竟是什麼? –
現代JVM上不是真的,沒有。輸入一個try {}過去會有一些有意義的成本,但是從熱點開始就已經被調整了。不是一個答案,因爲我現在沒有時間找到引用,對不起:( – Affe