簡體   English   中英

Java:輸入/使用“try-catch”塊的開銷?

[英]Java: overhead of entering/using “try-catch” blocks?

問題就是這一切。 雖然命中率不是很高(我測量它的速度在1.5x到2x之間),但是try-catch的字節代碼與沒有try-catch的字節代碼之間沒有區別。 那么是什么讓它通常變慢?

PL。 請注意,問題不在於拋出異常的開銷,而在於進入/離開try塊。

編輯:這是代碼(在Hotspot 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();       
}

由於您有一個微基准測試,因此您更有可能測試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
}

我的另一個問題的微基准測試顯示,使用/不使用try-catch塊之間沒有顯着差異,無論是否在塊中拋出異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM