2011-11-24 24 views
6

メッセージをチェックするのではなく、例外をキャッチするときにtry-catchがどれくらい時間がかかりますか(メッセージには検索のためのHashMapタイプのパフォーマンスがあると仮定します)。キャッチパフォーマンスを試してくださいJava

if (message.contains(MessageField.TIMESTAMP)) 
    timestamp = message.getLongField(MessageField.TIMESTAMP); 
+0

これは、JVM、基盤となるハードウェアなどのさまざまな基盤を変えようとしています。自分で測定してみましたか? – Sean

+1

それは例外的な状況ですか?それをエラーとして記録する必要がありますか?このコードはループで実行されますか? –

+0

重複:http://stackoverflow.com/questions/4280831/java-try-catch-performance-is-it-recommended-to-keep-what-is-inside-the-try-cla&http:// stackoverflow.com/questions/5158665/java-try-catch-blocks –

答えて

22

簡潔には、チェックはの方法です。小切手は以下の理由でご利用ください:

  • 例外は高価です!スタックトレースを作成する必要があります(使用されている場合、ログなど)。特殊なフロー制御が処理されます。
  • 例外はフロー制御に使用しないでください。例外は「例外」です。
  • 例外は、このような状況を扱うことができないと私はあきらめてる...あなたが!それに対処する」が、ここであなたはそれを扱うことができます...ので、別の答えがある
+0

状況によっては、例外が最適化される可能性があるため、すべてのケースで必ずしも遅くなるとは限りません。 –

+2

+1:スタックトレースは使用されるまで完全には作成されません(ほとんどの例外は不要です)。同じ例外はすべて高価なものではなく、例外的な条件でなければなりません。 –

+0

@PeterLawreyありがとう - 使用するまでスタックトレースが作成されていないことはわかりませんでした – Bohemian

3

try { 
     timestamp = message.getLongField(MessageField.TIMESTAMP); 
    } catch (MissingDataException e) { 
     //Not all messages contain this field 
    } 

答えは "はるかに長い" です。例外は、スタックトレースを作成するためのチェックに比べて遅いです。

一般的な点として、プログラムの流れを制御するための例外を使用すると、コードが複雑になるので、悪い考えです。常に例外的なことが起こった場合には、チェックを行い、例外を残してください。

+0

これを数量化したいと思います... –

+0

場合によっては、例外が最適化される可能性があるため、すべてのケースで必ずしも遅くなるとは限りません。 –

3

をそれを扱う 『誰が気に!』 。それは間違っています!いずれの場合においても

は、あなたがベンチマークにそれをしたい場合は、https://github.com/google/caliper

+0

誰でもこれを行いましたか? try(e)... catch(Exception e){}のコストは非常に高価なので、まれな(すなわち、例外的な)状況に対してのみ使用したいと思っています。しかし、どのように "試して"テストを行うことができます(if(x))、add(i + = j)、など私は試してみてくださいmayeのどこかで考えることができます。 – peterk

+0

はまだ維持されているキャリパーですか?私の場合は 'NoSuchMethodError'をスローします – Joel

+0

Githubに移動したようです。リンクを更新しました – alex

1

がこれを定量化したい使用して...

一般的に定量化するために文字通り不可能です。ナノ秒ではありません...実行プラットフォームに依存するためです。そしてパーセンテージでさえそうではありません。

時間はスタックトレースをキャプチャするのにかかる時間に大きく左右されます。は、例外がスローされたときのスタックの深さによって異なります。これは、通常の条件文ではなくJava例外を使用することが、本当に悪い考えである理由の1つに過ぎません。

しかし、フリップ側は、それが特定のポイントで投げスタックトレースと例外が決してになるだろうされていないと判断することができるという例外関連のコードを重く最適化提供するJITコンパイラの範囲があるということです中古。


実際にいくつかの(IMO、無意味でほとんど無意味な)番号が必要な場合は、独自のベンチマークを行う必要があります。がんばろう。

関連する問題