2012-04-16 5 views
3

質問はそれをすべて言っています。ヒットはそれほど重要ではありませんが(私はそれを1.5倍から2倍遅く測定しました)、try-catchのあるバイトコードとそれがないバイトコードに違いはありません。それで何が一般的に遅くなりますか?Java: "try-catch"ブロックに入る/使用するオーバーヘッド?

P1。問題は、例外をスローするオーバーヘッドではなく、tryブロックを出入りすることの問題であることに注意してください。

EDIT:ここ コード(ホットスポット1.6.0_31サーバー上で実行)

static void tryCatch() 
{ 
    int i = 0; 
    long l1 = getTime(); 
    for(int j = 0; j < 100000; j++) 
    { 
     try 
     { 
      i++;     
     } 
     catch(Exception e) 
     { 

     } 
    } 
    long l2 = getTime(); 
    System.out.println("with try-catch: " + (l2 - l1) + ": " + i);  
} 

static void noTryCatch() 
{ 
    int i = 0; 
    long l1 = getTime(); 
    for(int j = 0; j < 100000; j++) 
    { 
     i++; 
    } 
    long l2 = getTime(); 
    System.out.println("w/o try-catch: " + (l2 - l1) + ": " + i); 
} 

static long getTime() 
{ 
    return System.nanoTime();  
} 

EDIT2です:あなたはマイクロベンチマークを持っているのでhttp://jsperf.com/try-catch-overhead

+11

これをどのように測定したかを示してください。ベンチマークは正しく理解するのが難しいことが知られています。 –

+3

また、try-catchはバイトコードで表現されるだけでなく、メソッドのコード属性でも表現されます。言い換えれば、try-catch実装の* part *のみがバイトコードで参照されます。 –

+0

ここに、あなたが求める答えがあると思われる質問があります。これが重複した質問であると考えられるかどうかわからない:http://stackoverflow.com/questions/2633834/should-java-try-blocks-be-scoped-as-tightly-as-possible – bezmax

答えて

9

:実際には、このようなテストを行うために、この素​​敵なリンクを見つけましたtry/catchブロックがJVMコンパイラにどのように混乱しているかをテストしている可能性が高くなります。例えば、JVMはよりアグレッシブ最適化を防ぐことができますが、より現実的なブロックの任意の違いを確認しない場合がありますtry/catchブロックを使用して

for(int j = 0; j < 100000; j++) { 
    i++; 
} 

i += 100000 * 1; 

にを変更することが十分にスマートすることができコードの


いずれにせよ、私は普通

for(int j = 0; j < 100000; j++) { 
    try { 
     // do something 
    } catch(Exception e) { 
     // break or return 
    } 
} 

のようなものを変更します。別の質問のための

try { 
    for(int j = 0; j < 100000; j++) { 
     // do something 
    } 
} catch(Exception e) { 
    // continue or return 
} 
+0

Thx(+1)です。しかし、私はtryブロックに「入る」コストを測定したい。あなたが示唆したアプローチでは、おそらく私はそれを測定することができません。 – shrini1000

+0

私は、コードを複雑にすることでJVMのマイクロ最適化を妨げるだけのコストだと考えています。例えばメソッドは35バイト以下の場合にのみインライン化されます。 try/catchブロックは、インライン化を防ぐことができる数バイトを追加する可能性があります。 –

2

microbenchmarkして、またはブロックにかどうか、例外をスローせず、try-catchブロックを使用して使用して/いない間に有意差はありませんが示されました。

関連する問題