3

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

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

編集:ここにコードがあります(ホットスポット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();       
}
4

2 に答える 2

9

マイクロ ベンチマークがあるので、try/catch ブロックが JVM コンパイラにとってどれほど混乱しているかをテストしている可能性が高くなります。たとえば、JVM はスマートに変更できる

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

の中へ

i += 100000 * 1;

try/catch ブロックを使用すると、より積極的な最適化を防ぐことができますが、より現実的なコード ブロックには違いがない可能性があります。


いずれにせよ、私は通常、次のようなものを変更します

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
}
于 2012-04-16T07:19:38.787 に答える